apache-airflow-providers-google 10.18.0rc2__py3-none-any.whl → 10.19.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/__init__.py +1 -1
- airflow/providers/google/cloud/hooks/bigquery.py +11 -10
- airflow/providers/google/cloud/links/automl.py +38 -0
- airflow/providers/google/cloud/links/translate.py +180 -0
- airflow/providers/google/cloud/log/stackdriver_task_handler.py +1 -2
- airflow/providers/google/cloud/openlineage/BigQueryErrorRunFacet.json +30 -0
- airflow/providers/google/cloud/openlineage/BigQueryJobRunFacet.json +37 -0
- airflow/providers/google/cloud/openlineage/__init__.py +16 -0
- airflow/providers/google/cloud/openlineage/utils.py +388 -0
- airflow/providers/google/cloud/operators/automl.py +75 -63
- airflow/providers/google/cloud/operators/bigquery.py +1 -62
- airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +5 -0
- airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +6 -0
- airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py +7 -4
- airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +1 -1
- airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +1 -1
- airflow/providers/google/cloud/triggers/pubsub.py +8 -11
- airflow/providers/google/cloud/utils/credentials_provider.py +41 -32
- airflow/providers/google/common/hooks/base_google.py +11 -5
- airflow/providers/google/get_provider_info.py +8 -2
- {apache_airflow_providers_google-10.18.0rc2.dist-info → apache_airflow_providers_google-10.19.0rc1.dist-info}/METADATA +8 -8
- {apache_airflow_providers_google-10.18.0rc2.dist-info → apache_airflow_providers_google-10.19.0rc1.dist-info}/RECORD +24 -20
- airflow/providers/google/cloud/utils/openlineage.py +0 -81
- {apache_airflow_providers_google-10.18.0rc2.dist-info → apache_airflow_providers_google-10.19.0rc1.dist-info}/WHEEL +0 -0
- {apache_airflow_providers_google-10.18.0rc2.dist-info → apache_airflow_providers_google-10.19.0rc1.dist-info}/entry_points.txt +0 -0
@@ -28,9 +28,9 @@ from typing import Collection, Generator, Sequence
|
|
28
28
|
from urllib.parse import urlencode
|
29
29
|
|
30
30
|
import google.auth
|
31
|
-
import google.auth.credentials
|
32
31
|
import google.oauth2.service_account
|
33
32
|
from google.auth import impersonated_credentials # type: ignore[attr-defined]
|
33
|
+
from google.auth.credentials import AnonymousCredentials, Credentials
|
34
34
|
from google.auth.environment_vars import CREDENTIALS, LEGACY_PROJECT, PROJECT
|
35
35
|
|
36
36
|
from airflow.exceptions import AirflowException
|
@@ -178,6 +178,7 @@ class _CredentialProvider(LoggingMixin):
|
|
178
178
|
:param key_secret_name: Keyfile Secret Name in GCP Secret Manager.
|
179
179
|
:param key_secret_project_id: Project ID to read the secrets from. If not passed, the project ID from
|
180
180
|
default credentials will be used.
|
181
|
+
:param credential_config_file: File path to or content of a GCP credential configuration file.
|
181
182
|
:param scopes: OAuth scopes for the connection
|
182
183
|
:param delegate_to: The account to impersonate using domain-wide delegation of authority,
|
183
184
|
if any. For this to work, the service account making the request must have
|
@@ -192,6 +193,8 @@ class _CredentialProvider(LoggingMixin):
|
|
192
193
|
Service Account Token Creator IAM role to the directly preceding identity, with first
|
193
194
|
account from the list granting this role to the originating account and target_principal
|
194
195
|
granting the role to the last account from the list.
|
196
|
+
:param is_anonymous: Provides an anonymous set of credentials,
|
197
|
+
which is useful for APIs which do not require authentication.
|
195
198
|
"""
|
196
199
|
|
197
200
|
def __init__(
|
@@ -206,13 +209,14 @@ class _CredentialProvider(LoggingMixin):
|
|
206
209
|
disable_logging: bool = False,
|
207
210
|
target_principal: str | None = None,
|
208
211
|
delegates: Sequence[str] | None = None,
|
212
|
+
is_anonymous: bool | None = None,
|
209
213
|
) -> None:
|
210
214
|
super().__init__()
|
211
|
-
key_options = [key_path, key_secret_name,
|
215
|
+
key_options = [key_path, keyfile_dict, credential_config_file, key_secret_name, is_anonymous]
|
212
216
|
if len([x for x in key_options if x]) > 1:
|
213
217
|
raise AirflowException(
|
214
|
-
"The `keyfile_dict`, `key_path`,
|
215
|
-
"are all mutually exclusive. Please provide only one value."
|
218
|
+
"The `keyfile_dict`, `key_path`, `credential_config_file`, `is_anonymous` and"
|
219
|
+
" `key_secret_name` fields are all mutually exclusive. Please provide only one value."
|
216
220
|
)
|
217
221
|
self.key_path = key_path
|
218
222
|
self.keyfile_dict = keyfile_dict
|
@@ -224,43 +228,48 @@ class _CredentialProvider(LoggingMixin):
|
|
224
228
|
self.disable_logging = disable_logging
|
225
229
|
self.target_principal = target_principal
|
226
230
|
self.delegates = delegates
|
231
|
+
self.is_anonymous = is_anonymous
|
227
232
|
|
228
|
-
def get_credentials_and_project(self) -> tuple[
|
233
|
+
def get_credentials_and_project(self) -> tuple[Credentials, str]:
|
229
234
|
"""
|
230
235
|
Get current credentials and project ID.
|
231
236
|
|
237
|
+
Project ID is an empty string when using anonymous credentials.
|
238
|
+
|
232
239
|
:return: Google Auth Credentials
|
233
240
|
"""
|
234
|
-
if self.
|
235
|
-
credentials, project_id =
|
236
|
-
elif self.key_secret_name:
|
237
|
-
credentials, project_id = self._get_credentials_using_key_secret_name()
|
238
|
-
elif self.keyfile_dict:
|
239
|
-
credentials, project_id = self._get_credentials_using_keyfile_dict()
|
240
|
-
elif self.credential_config_file:
|
241
|
-
credentials, project_id = self._get_credentials_using_credential_config_file()
|
241
|
+
if self.is_anonymous:
|
242
|
+
credentials, project_id = AnonymousCredentials(), ""
|
242
243
|
else:
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
244
|
+
if self.key_path:
|
245
|
+
credentials, project_id = self._get_credentials_using_key_path()
|
246
|
+
elif self.key_secret_name:
|
247
|
+
credentials, project_id = self._get_credentials_using_key_secret_name()
|
248
|
+
elif self.keyfile_dict:
|
249
|
+
credentials, project_id = self._get_credentials_using_keyfile_dict()
|
250
|
+
elif self.credential_config_file:
|
251
|
+
credentials, project_id = self._get_credentials_using_credential_config_file()
|
248
252
|
else:
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
+
credentials, project_id = self._get_credentials_using_adc()
|
254
|
+
if self.delegate_to:
|
255
|
+
if hasattr(credentials, "with_subject"):
|
256
|
+
credentials = credentials.with_subject(self.delegate_to)
|
257
|
+
else:
|
258
|
+
raise AirflowException(
|
259
|
+
"The `delegate_to` parameter cannot be used here as the current "
|
260
|
+
"authentication method does not support account impersonate. "
|
261
|
+
"Please use service-account for authorization."
|
262
|
+
)
|
263
|
+
|
264
|
+
if self.target_principal:
|
265
|
+
credentials = impersonated_credentials.Credentials(
|
266
|
+
source_credentials=credentials,
|
267
|
+
target_principal=self.target_principal,
|
268
|
+
delegates=self.delegates,
|
269
|
+
target_scopes=self.scopes,
|
253
270
|
)
|
254
271
|
|
255
|
-
|
256
|
-
credentials = impersonated_credentials.Credentials(
|
257
|
-
source_credentials=credentials,
|
258
|
-
target_principal=self.target_principal,
|
259
|
-
delegates=self.delegates,
|
260
|
-
target_scopes=self.scopes,
|
261
|
-
)
|
262
|
-
|
263
|
-
project_id = _get_project_id_from_service_account_email(self.target_principal)
|
272
|
+
project_id = _get_project_id_from_service_account_email(self.target_principal)
|
264
273
|
|
265
274
|
return credentials, project_id
|
266
275
|
|
@@ -357,7 +366,7 @@ class _CredentialProvider(LoggingMixin):
|
|
357
366
|
self.log.debug(*args, **kwargs)
|
358
367
|
|
359
368
|
|
360
|
-
def get_credentials_and_project_id(*args, **kwargs) -> tuple[
|
369
|
+
def get_credentials_and_project_id(*args, **kwargs) -> tuple[Credentials, str]:
|
361
370
|
"""Return the Credentials object for Google API and the associated project_id."""
|
362
371
|
return _CredentialProvider(*args, **kwargs).get_credentials_and_project()
|
363
372
|
|
@@ -30,7 +30,6 @@ from subprocess import check_output
|
|
30
30
|
from typing import TYPE_CHECKING, Any, Callable, Generator, Sequence, TypeVar, cast
|
31
31
|
|
32
32
|
import google.auth
|
33
|
-
import google.auth.credentials
|
34
33
|
import google.oauth2.service_account
|
35
34
|
import google_auth_httplib2
|
36
35
|
import requests
|
@@ -223,7 +222,7 @@ class GoogleBaseHook(BaseHook):
|
|
223
222
|
"""Return connection widgets to add to connection form."""
|
224
223
|
from flask_appbuilder.fieldwidgets import BS3PasswordFieldWidget, BS3TextFieldWidget
|
225
224
|
from flask_babel import lazy_gettext
|
226
|
-
from wtforms import IntegerField, PasswordField, StringField
|
225
|
+
from wtforms import BooleanField, IntegerField, PasswordField, StringField
|
227
226
|
from wtforms.validators import NumberRange
|
228
227
|
|
229
228
|
return {
|
@@ -249,6 +248,9 @@ class GoogleBaseHook(BaseHook):
|
|
249
248
|
"impersonation_chain": StringField(
|
250
249
|
lazy_gettext("Impersonation Chain"), widget=BS3TextFieldWidget()
|
251
250
|
),
|
251
|
+
"is_anonymous": BooleanField(
|
252
|
+
lazy_gettext("Anonymous credentials (ignores all other settings)"), default=False
|
253
|
+
),
|
252
254
|
}
|
253
255
|
|
254
256
|
@classmethod
|
@@ -270,10 +272,10 @@ class GoogleBaseHook(BaseHook):
|
|
270
272
|
self.delegate_to = delegate_to
|
271
273
|
self.impersonation_chain = impersonation_chain
|
272
274
|
self.extras: dict = self.get_connection(self.gcp_conn_id).extra_dejson
|
273
|
-
self._cached_credentials:
|
275
|
+
self._cached_credentials: Credentials | None = None
|
274
276
|
self._cached_project_id: str | None = None
|
275
277
|
|
276
|
-
def get_credentials_and_project_id(self) -> tuple[
|
278
|
+
def get_credentials_and_project_id(self) -> tuple[Credentials, str | None]:
|
277
279
|
"""Return the Credentials object for Google API and the associated project_id."""
|
278
280
|
if self._cached_credentials is not None:
|
279
281
|
return self._cached_credentials, self._cached_project_id
|
@@ -301,6 +303,7 @@ class GoogleBaseHook(BaseHook):
|
|
301
303
|
self.impersonation_chain = [s.strip() for s in self.impersonation_chain.split(",")]
|
302
304
|
|
303
305
|
target_principal, delegates = _get_target_principal_and_delegates(self.impersonation_chain)
|
306
|
+
is_anonymous = self._get_field("is_anonymous")
|
304
307
|
|
305
308
|
credentials, project_id = get_credentials_and_project_id(
|
306
309
|
key_path=key_path,
|
@@ -312,6 +315,7 @@ class GoogleBaseHook(BaseHook):
|
|
312
315
|
delegate_to=self.delegate_to,
|
313
316
|
target_principal=target_principal,
|
314
317
|
delegates=delegates,
|
318
|
+
is_anonymous=is_anonymous,
|
315
319
|
)
|
316
320
|
|
317
321
|
overridden_project_id = self._get_field("project")
|
@@ -323,7 +327,7 @@ class GoogleBaseHook(BaseHook):
|
|
323
327
|
|
324
328
|
return credentials, project_id
|
325
329
|
|
326
|
-
def get_credentials(self) ->
|
330
|
+
def get_credentials(self) -> Credentials:
|
327
331
|
"""Return the Credentials object for Google API."""
|
328
332
|
credentials, _ = self.get_credentials_and_project_id()
|
329
333
|
return credentials
|
@@ -655,6 +659,8 @@ class GoogleBaseHook(BaseHook):
|
|
655
659
|
def test_connection(self):
|
656
660
|
"""Test the Google cloud connectivity from UI."""
|
657
661
|
status, message = False, ""
|
662
|
+
if self._get_field("is_anonymous"):
|
663
|
+
return True, "Credentials are anonymous"
|
658
664
|
try:
|
659
665
|
token = self._get_access_token()
|
660
666
|
url = f"https://www.googleapis.com/oauth2/v3/tokeninfo?access_token={token}"
|
@@ -28,8 +28,9 @@ def get_provider_info():
|
|
28
28
|
"name": "Google",
|
29
29
|
"description": "Google services including:\n\n - `Google Ads <https://ads.google.com/>`__\n - `Google Cloud (GCP) <https://cloud.google.com/>`__\n - `Google Firebase <https://firebase.google.com/>`__\n - `Google LevelDB <https://github.com/google/leveldb/>`__\n - `Google Marketing Platform <https://marketingplatform.google.com/>`__\n - `Google Workspace <https://workspace.google.com/>`__ (formerly Google Suite)\n",
|
30
30
|
"state": "ready",
|
31
|
-
"source-date-epoch":
|
31
|
+
"source-date-epoch": 1716287849,
|
32
32
|
"versions": [
|
33
|
+
"10.19.0",
|
33
34
|
"10.18.0",
|
34
35
|
"10.17.0",
|
35
36
|
"10.16.0",
|
@@ -102,7 +103,7 @@ def get_provider_info():
|
|
102
103
|
"google-auth-httplib2>=0.0.1",
|
103
104
|
"google-cloud-aiplatform>=1.42.1",
|
104
105
|
"google-cloud-automl>=2.12.0",
|
105
|
-
"google-cloud-bigquery
|
106
|
+
"google-cloud-bigquery<3.21.0,>=3.0.1",
|
106
107
|
"google-cloud-bigquery-datatransfer>=3.13.0",
|
107
108
|
"google-cloud-bigtable>=2.17.0",
|
108
109
|
"google-cloud-build>=3.22.0",
|
@@ -1580,6 +1581,11 @@ def get_provider_info():
|
|
1580
1581
|
"airflow.providers.google.common.links.storage.StorageLink",
|
1581
1582
|
"airflow.providers.google.common.links.storage.FileDetailsLink",
|
1582
1583
|
"airflow.providers.google.marketing_platform.links.analytics_admin.GoogleAnalyticsPropertyLink",
|
1584
|
+
"airflow.providers.google.cloud.links.translate.TranslationLegacyDatasetLink",
|
1585
|
+
"airflow.providers.google.cloud.links.translate.TranslationDatasetListLink",
|
1586
|
+
"airflow.providers.google.cloud.links.translate.TranslationLegacyModelLink",
|
1587
|
+
"airflow.providers.google.cloud.links.translate.TranslationLegacyModelTrainLink",
|
1588
|
+
"airflow.providers.google.cloud.links.translate.TranslationLegacyModelPredictLink",
|
1583
1589
|
],
|
1584
1590
|
"secrets-backends": [
|
1585
1591
|
"airflow.providers.google.cloud.secrets.secret_manager.CloudSecretManagerBackend"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: apache-airflow-providers-google
|
3
|
-
Version: 10.
|
3
|
+
Version: 10.19.0rc1
|
4
4
|
Summary: Provider package apache-airflow-providers-google for Apache Airflow
|
5
5
|
Keywords: airflow-provider,google,airflow,integration
|
6
6
|
Author-email: Apache Software Foundation <dev@airflow.apache.org>
|
@@ -39,7 +39,7 @@ Requires-Dist: google-cloud-aiplatform>=1.42.1
|
|
39
39
|
Requires-Dist: google-cloud-automl>=2.12.0
|
40
40
|
Requires-Dist: google-cloud-batch>=0.13.0
|
41
41
|
Requires-Dist: google-cloud-bigquery-datatransfer>=3.13.0
|
42
|
-
Requires-Dist: google-cloud-bigquery
|
42
|
+
Requires-Dist: google-cloud-bigquery<3.21.0,>=3.0.1
|
43
43
|
Requires-Dist: google-cloud-bigtable>=2.17.0
|
44
44
|
Requires-Dist: google-cloud-build>=3.22.0
|
45
45
|
Requires-Dist: google-cloud-compute>=1.10.0
|
@@ -102,8 +102,8 @@ Requires-Dist: apache-airflow-providers-sftp ; extra == "sftp"
|
|
102
102
|
Requires-Dist: apache-airflow-providers-ssh ; extra == "ssh"
|
103
103
|
Requires-Dist: apache-airflow-providers-trino ; extra == "trino"
|
104
104
|
Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
|
105
|
-
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-google/10.
|
106
|
-
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-google/10.
|
105
|
+
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-google/10.19.0/changelog.html
|
106
|
+
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-google/10.19.0
|
107
107
|
Project-URL: Slack Chat, https://s.apache.org/airflow-slack
|
108
108
|
Project-URL: Source Code, https://github.com/apache/airflow
|
109
109
|
Project-URL: Twitter, https://twitter.com/ApacheAirflow
|
@@ -171,7 +171,7 @@ Provides-Extra: trino
|
|
171
171
|
|
172
172
|
Package ``apache-airflow-providers-google``
|
173
173
|
|
174
|
-
Release: ``10.
|
174
|
+
Release: ``10.19.0.rc1``
|
175
175
|
|
176
176
|
|
177
177
|
Google services including:
|
@@ -191,7 +191,7 @@ This is a provider package for ``google`` provider. All classes for this provide
|
|
191
191
|
are in ``airflow.providers.google`` python package.
|
192
192
|
|
193
193
|
You can find package information and changelog for the provider
|
194
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-google/10.
|
194
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-google/10.19.0/>`_.
|
195
195
|
|
196
196
|
Installation
|
197
197
|
------------
|
@@ -223,7 +223,7 @@ PIP package Version required
|
|
223
223
|
``google-auth-httplib2`` ``>=0.0.1``
|
224
224
|
``google-cloud-aiplatform`` ``>=1.42.1``
|
225
225
|
``google-cloud-automl`` ``>=2.12.0``
|
226
|
-
``google-cloud-bigquery`` ``>=3.0.1``
|
226
|
+
``google-cloud-bigquery`` ``>=3.0.1,<3.21.0``
|
227
227
|
``google-cloud-bigquery-datatransfer`` ``>=3.13.0``
|
228
228
|
``google-cloud-bigtable`` ``>=2.17.0``
|
229
229
|
``google-cloud-build`` ``>=3.22.0``
|
@@ -307,4 +307,4 @@ Dependent package
|
|
307
307
|
======================================================================================================================== ====================
|
308
308
|
|
309
309
|
The changelog for the provider package can be found in the
|
310
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-google/10.
|
310
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-google/10.19.0/changelog.html>`_.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
airflow/providers/google/LICENSE,sha256=ywUBpKZc7Jb96rVt5I3IDbg7dIJAbUSHkuoDcF3jbH4,13569
|
2
|
-
airflow/providers/google/__init__.py,sha256
|
3
|
-
airflow/providers/google/get_provider_info.py,sha256=
|
2
|
+
airflow/providers/google/__init__.py,sha256=HUAzlPMwd7ZcKlpNWvIEzhsb03w5fHEZL1TUuffqeB4,1495
|
3
|
+
airflow/providers/google/get_provider_info.py,sha256=0Yt7U4KS6kyRqOy9webKBMT6SdgdXmlEAzwnZAVcuxk,81694
|
4
4
|
airflow/providers/google/go_module_utils.py,sha256=QZcIY0BAsy_GlwJpaCDcSRWHueZvkqDCj2ecICn_-gY,1770
|
5
5
|
airflow/providers/google/ads/.gitignore,sha256=z_qaKzblF2LuVvP-06iDord9JBeyzIlNeJ4bx3LbtGc,167
|
6
6
|
airflow/providers/google/ads/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
@@ -23,7 +23,7 @@ airflow/providers/google/cloud/fs/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2x
|
|
23
23
|
airflow/providers/google/cloud/fs/gcs.py,sha256=fJBGhHEE46_U5Rmbs1W0uenvGhECv13CtVSh3z7pM60,2457
|
24
24
|
airflow/providers/google/cloud/hooks/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
25
25
|
airflow/providers/google/cloud/hooks/automl.py,sha256=5fp8vZ96at8jH-a4yYipu4FI3J809b2E6XLCOQVhzmY,28959
|
26
|
-
airflow/providers/google/cloud/hooks/bigquery.py,sha256=
|
26
|
+
airflow/providers/google/cloud/hooks/bigquery.py,sha256=Z-oOfzrM2vxN2BpOP-pdiaZ_I1Pdf87H3up8wgYRF6Y,155305
|
27
27
|
airflow/providers/google/cloud/hooks/bigquery_dts.py,sha256=3wLKj-6tQwWphjwKBLGg1rjoXAAknv0WLh6T3MqsNWA,15228
|
28
28
|
airflow/providers/google/cloud/hooks/bigtable.py,sha256=wReDIbDyQGP8oZIzg0vsfgD6zrLmY-oYghBNCPVPorw,12580
|
29
29
|
airflow/providers/google/cloud/hooks/cloud_batch.py,sha256=FjpR_Av7z8oMnB4Q7S-aPTMO8HZMxAo_1akdHpE7iA8,7809
|
@@ -79,7 +79,7 @@ airflow/providers/google/cloud/hooks/vertex_ai/model_service.py,sha256=KCqCyxjsx
|
|
79
79
|
airflow/providers/google/cloud/hooks/vertex_ai/pipeline_job.py,sha256=b4PlBV0MqrOUIwR6heuPwiFGFnEHaaduPTV3iibbs_Y,29023
|
80
80
|
airflow/providers/google/cloud/hooks/vertex_ai/prediction_service.py,sha256=Q-EzmMtE4hjEg_tH-vnE-PcrXTvoQY2QFh77reVH840,4263
|
81
81
|
airflow/providers/google/cloud/links/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
82
|
-
airflow/providers/google/cloud/links/automl.py,sha256=
|
82
|
+
airflow/providers/google/cloud/links/automl.py,sha256=_NtdMn9WG0PQMegzVB3Tnb_QYcnsqHW7HHjcNCNok6E,6375
|
83
83
|
airflow/providers/google/cloud/links/base.py,sha256=6Y96NArcm-f4Yw1YYqaoRdXfLLWwMH01XDAzIA-a3NA,1660
|
84
84
|
airflow/providers/google/cloud/links/bigquery.py,sha256=VUUKpzqVd0GWXQUne3xFtwpQrIoauebQqzIypGSqByY,2532
|
85
85
|
airflow/providers/google/cloud/links/bigquery_dts.py,sha256=0zRXjws8jmWLs-4GxoQAvnQv7V_AZnTMhw1YkYJZ3ec,1876
|
@@ -106,14 +106,19 @@ airflow/providers/google/cloud/links/mlengine.py,sha256=lvhRkVVExFvwoaSskckm31BW
|
|
106
106
|
airflow/providers/google/cloud/links/pubsub.py,sha256=MqCg3vHUvPVT1nkEwnjhNf5mmF5zPGtqsyxE-qkRCIw,2423
|
107
107
|
airflow/providers/google/cloud/links/spanner.py,sha256=L2j8b6VIrLta1zTM_hsoK5sYpGb3VPf6HQ92qYhQyWk,2510
|
108
108
|
airflow/providers/google/cloud/links/stackdriver.py,sha256=WgO-KeX9guf5l4Z3TLPUD_Pns8UZzUfbRVL4kdec8z0,2413
|
109
|
+
airflow/providers/google/cloud/links/translate.py,sha256=p0tHVr_CHPJswCmNheQAnpPreM8a30AT7EjD9xW4LJk,5467
|
109
110
|
airflow/providers/google/cloud/links/vertex_ai.py,sha256=T5WGK77wKIPTiHtxKuQXvokArjVQYwZPjX5IgJX1dds,11138
|
110
111
|
airflow/providers/google/cloud/links/workflows.py,sha256=Ux7bwq2fspvSoNT4X3xFXX2SSmp8EuwDyPQsTO-z7bI,3303
|
111
112
|
airflow/providers/google/cloud/log/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
112
113
|
airflow/providers/google/cloud/log/gcs_task_handler.py,sha256=d2zTPtoQHwdFIXuWbHu0xniA2oor9BEBYBNgJaWeF-0,10386
|
113
|
-
airflow/providers/google/cloud/log/stackdriver_task_handler.py,sha256=
|
114
|
+
airflow/providers/google/cloud/log/stackdriver_task_handler.py,sha256=mOpGUHR1vCyge2ysf7m3Jv02VSDkUXq5IfJCu0qvyk8,15512
|
115
|
+
airflow/providers/google/cloud/openlineage/BigQueryErrorRunFacet.json,sha256=3whXAY38LjxmQTpCnExiIU1Q1-8dZGtWjiK0A4JQWTA,688
|
116
|
+
airflow/providers/google/cloud/openlineage/BigQueryJobRunFacet.json,sha256=sWvE1o30bCqBBmB19n6wFZyL6BBcc22kCGWe0qcsYBc,850
|
117
|
+
airflow/providers/google/cloud/openlineage/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
118
|
+
airflow/providers/google/cloud/openlineage/utils.py,sha256=VmYxUSj_Vg36rj9F8d3M7gO5BHUO9V0UC6Hj6u-NNpM,14699
|
114
119
|
airflow/providers/google/cloud/operators/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
115
|
-
airflow/providers/google/cloud/operators/automl.py,sha256=
|
116
|
-
airflow/providers/google/cloud/operators/bigquery.py,sha256=
|
120
|
+
airflow/providers/google/cloud/operators/automl.py,sha256=uZ-PSDqfBBviH0YWxh8gefr4DU5xiEkucYGRtSyDOG8,63479
|
121
|
+
airflow/providers/google/cloud/operators/bigquery.py,sha256=xCc5j4U7KNJ4Lq_asI7s1H0bZeeVZEUnOTavtL5VNy8,127444
|
117
122
|
airflow/providers/google/cloud/operators/bigquery_dts.py,sha256=6VJISM4HoMBQ3EQ5nz3zxFk8tfluGA1d2vcUNUlYLPc,17695
|
118
123
|
airflow/providers/google/cloud/operators/bigtable.py,sha256=BnWHnTEscyPbsKWFaSreLr62W68fmHu5loQVZex7LPs,26921
|
119
124
|
airflow/providers/google/cloud/operators/cloud_base.py,sha256=Xysh4znvIQIxbQqmfKoaL6O09FikndHrQuKKUnEV7KU,1483
|
@@ -155,9 +160,9 @@ airflow/providers/google/cloud/operators/video_intelligence.py,sha256=NQvEueDegd
|
|
155
160
|
airflow/providers/google/cloud/operators/vision.py,sha256=RQrf9-dgRfgYxDceR--WMvc03d2a1zZaOQWzZxjrJYo,67630
|
156
161
|
airflow/providers/google/cloud/operators/workflows.py,sha256=fnyWLqRHz0UYu6AnQKKZIMlfSIg_v5nNbZAt6ASe4fI,28977
|
157
162
|
airflow/providers/google/cloud/operators/vertex_ai/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
158
|
-
airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py,sha256=
|
163
|
+
airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py,sha256=gkJ94t0IMFVbpWNwbBL8_KhL6S6gYLNlwK-Qvb2kVa0,31442
|
159
164
|
airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py,sha256=e0oFWmCRH3aQHNckjEf_YO5zP9LqiLVTzB1QTgv3iUo,28828
|
160
|
-
airflow/providers/google/cloud/operators/vertex_ai/custom_job.py,sha256=
|
165
|
+
airflow/providers/google/cloud/operators/vertex_ai/custom_job.py,sha256=LGCdbHyaXd8I0z8CBq2JOmc6WN4NZkoO0hhMP3KKAvA,100374
|
161
166
|
airflow/providers/google/cloud/operators/vertex_ai/dataset.py,sha256=u_iEOIJEoZj10bbiymvoAT7aJP50HyZMt7_2KxUKbxM,23051
|
162
167
|
airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py,sha256=mtbgC2NrolxIxyxOmqlnokc22NtCspa8oXwuHo140EU,26739
|
163
168
|
airflow/providers/google/cloud/operators/vertex_ai/generative_model.py,sha256=k86sTqmDNWVcESuyAUxY1neeifASrusCo5MbKff6EWU,13634
|
@@ -187,9 +192,9 @@ airflow/providers/google/cloud/sensors/workflows.py,sha256=iJdPt5J-9nTNFIWRcQqzX
|
|
187
192
|
airflow/providers/google/cloud/transfers/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
188
193
|
airflow/providers/google/cloud/transfers/adls_to_gcs.py,sha256=ona1WA9oNhozj_JPI28sFUOukMJehkvQyjB558vfp4Q,6739
|
189
194
|
airflow/providers/google/cloud/transfers/azure_blob_to_gcs.py,sha256=kizj9bNJp_wBgWT2Ytk4Dsj1O0EpWssMKkA_n7PquUM,4813
|
190
|
-
airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py,sha256=
|
195
|
+
airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py,sha256=JlPRkiDsUBbu4WWHw-rTE2efmMw3uI84LR7pz4jHn1o,8182
|
191
196
|
airflow/providers/google/cloud/transfers/bigquery_to_bigquery.py,sha256=jQzd_QtgGDAcfWvLgKPSQuH70t-GFFbzrV7vS6Y-Zd4,8180
|
192
|
-
airflow/providers/google/cloud/transfers/bigquery_to_gcs.py,sha256=
|
197
|
+
airflow/providers/google/cloud/transfers/bigquery_to_gcs.py,sha256=tmcQ1T6Lr6k2a-0WWGdUE8x3lTxHPFNTk6F7EQIrLdU,14854
|
193
198
|
airflow/providers/google/cloud/transfers/bigquery_to_mssql.py,sha256=24MKm3FeZ1HLVnNhxVUre4nr5KztYJKFgc-yO55sdAk,4056
|
194
199
|
airflow/providers/google/cloud/transfers/bigquery_to_mysql.py,sha256=zMEadzSW-lXrxvSVHimNX9NQN2_6Q55dzrqHehQJKlA,3092
|
195
200
|
airflow/providers/google/cloud/transfers/bigquery_to_postgres.py,sha256=4vmVgmZlBzBJOPMnuW4nUiTee6l3QDyvVL8AqhD4YPA,1984
|
@@ -197,7 +202,7 @@ airflow/providers/google/cloud/transfers/bigquery_to_sql.py,sha256=n9MdtPYPLTXQx
|
|
197
202
|
airflow/providers/google/cloud/transfers/calendar_to_gcs.py,sha256=Yba_iwBxCFXW-jHcpB9fTd8bCgq5J4yJr764N1Xe7Ss,8399
|
198
203
|
airflow/providers/google/cloud/transfers/cassandra_to_gcs.py,sha256=3f2Q6seMBXHbLOXYa3m5GDh6N8fY-IOQSn1lu6Jmnv4,15814
|
199
204
|
airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py,sha256=FFUOMx6S4DRgFbIBIkRZKcHfwDICawSKSc16260PPuo,10322
|
200
|
-
airflow/providers/google/cloud/transfers/gcs_to_bigquery.py,sha256=
|
205
|
+
airflow/providers/google/cloud/transfers/gcs_to_bigquery.py,sha256=o6Jn8AfVPQBmt1O6rKxYy_IEGU7gmrqMjW2A3czAFGo,36690
|
201
206
|
airflow/providers/google/cloud/transfers/gcs_to_gcs.py,sha256=ItZBJZsIziOfRgCEAZ0-Z28K1afk-UcGD7cKDTGRVNA,26315
|
202
207
|
airflow/providers/google/cloud/transfers/gcs_to_local.py,sha256=qWUR9TZrj3Z5WzvO7gBAbr_V8LNhVHCAnjdlVgyuZBY,5274
|
203
208
|
airflow/providers/google/cloud/transfers/gcs_to_sftp.py,sha256=km9StbMCeVZc3Nupzkp9CJk9B2c_8dLmrbhwF1lTukU,8409
|
@@ -231,12 +236,12 @@ airflow/providers/google/cloud/triggers/dataproc.py,sha256=5eCSAkjg6FDL56P_7gvXu
|
|
231
236
|
airflow/providers/google/cloud/triggers/gcs.py,sha256=pMjeNOkWHkOyiAxeK-JoyDInUf2VNtefOZxp8K-aNjw,18973
|
232
237
|
airflow/providers/google/cloud/triggers/kubernetes_engine.py,sha256=XnCnGtHaZUEaYS1Yra0PTMovE06d2fcSUCNhIRsuCGc,12328
|
233
238
|
airflow/providers/google/cloud/triggers/mlengine.py,sha256=qpOa9Gz8FmHDxXvPWrXO3M7snGbRTq92gy6kGafCUiY,5265
|
234
|
-
airflow/providers/google/cloud/triggers/pubsub.py,sha256=
|
239
|
+
airflow/providers/google/cloud/triggers/pubsub.py,sha256=3t6foghoMpa_I_al8IQMkmxktqpcZbcuIhMIOe1MvZo,5604
|
235
240
|
airflow/providers/google/cloud/triggers/vertex_ai.py,sha256=99ah7Rcc_kYBihDXGcekZvkUz7ZNyXKv7j6R3vddcCE,9927
|
236
241
|
airflow/providers/google/cloud/utils/__init__.py,sha256=mlJxuZLkd5x-iq2SBwD3mvRQpt3YR7wjz_nceyF1IaI,787
|
237
242
|
airflow/providers/google/cloud/utils/bigquery.py,sha256=nMPUMpfsf-7QQEJG3wo1QqKuPGPwDUwKLGhE9SBjCaI,2145
|
238
243
|
airflow/providers/google/cloud/utils/bigquery_get_data.py,sha256=srSJSckp8ljprQ5Z_zqUAgdaEJlrFedccwe9ISlJkPQ,2092
|
239
|
-
airflow/providers/google/cloud/utils/credentials_provider.py,sha256=
|
244
|
+
airflow/providers/google/cloud/utils/credentials_provider.py,sha256=CWNy9iJZ066fr7VJfbIg_0JTyIPI1586VTIOZ8H-6Wc,18255
|
240
245
|
airflow/providers/google/cloud/utils/dataform.py,sha256=3ZrADuvqnhUdE-iaNN12X2k-2SZyoRfwzdmvZg_NQD8,7117
|
241
246
|
airflow/providers/google/cloud/utils/datafusion.py,sha256=IArDPasSlUjJykrAbU0uTSZXSAoGdJttZ0TA21cvrP0,1307
|
242
247
|
airflow/providers/google/cloud/utils/dataproc.py,sha256=2oyNiVlUKcHLt6e_yg76a856RYh78V5MDd_-F2YyLTs,960
|
@@ -245,13 +250,12 @@ airflow/providers/google/cloud/utils/field_validator.py,sha256=VUUDA8jKdl_Ct9lZh
|
|
245
250
|
airflow/providers/google/cloud/utils/helpers.py,sha256=h_stPmyWOProJhuDGc2tTX9GP4bDqses9hWHQUptp-Q,1899
|
246
251
|
airflow/providers/google/cloud/utils/mlengine_operator_utils.py,sha256=_dkQdytcnpK5-SJ_i8udzqsd1eMFyBTeeykedq7cfrM,11688
|
247
252
|
airflow/providers/google/cloud/utils/mlengine_prediction_summary.py,sha256=U3UKIraP01g14VByj1tVJRH0cqOR_S9RKmBifzYWOo0,7667
|
248
|
-
airflow/providers/google/cloud/utils/openlineage.py,sha256=dG-GMF_qDAzq91Rp-7iJa-csen6JbtuQbPMKiPlROKs,2885
|
249
253
|
airflow/providers/google/common/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
250
254
|
airflow/providers/google/common/consts.py,sha256=KKjQX0FO6HP4MuzS8DDfWPoQNk0mhdOrYe5CzDUx2e4,1050
|
251
255
|
airflow/providers/google/common/auth_backend/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
252
256
|
airflow/providers/google/common/auth_backend/google_openid.py,sha256=HvUAoHfpuK8gZiss0DCgB7R3wk2c1aDjAhwc7GknV4c,4525
|
253
257
|
airflow/providers/google/common/hooks/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
254
|
-
airflow/providers/google/common/hooks/base_google.py,sha256=
|
258
|
+
airflow/providers/google/common/hooks/base_google.py,sha256=i-woTvSJbzrnsCiXehuY99r70p9ssUmNwBhkneZzMDs,31710
|
255
259
|
airflow/providers/google/common/hooks/discovery_api.py,sha256=dHA3AHwsY7ETWM1fRoNknZZgz4cMnWw4q0PTQt0TiNA,6767
|
256
260
|
airflow/providers/google/common/links/__init__.py,sha256=9hdXHABrVpkbpjZgUft39kOFL2xSGeG4GEua0Hmelus,785
|
257
261
|
airflow/providers/google/common/links/storage.py,sha256=24tb1xQ00gbGyOu26wryNkTYXlk_9H-ieUra9WmuPIY,2265
|
@@ -304,7 +308,7 @@ airflow/providers/google/suite/transfers/gcs_to_gdrive.py,sha256=CxtVhp3wlEOBtjR
|
|
304
308
|
airflow/providers/google/suite/transfers/gcs_to_sheets.py,sha256=4nwXWkTySeBXNuThPxzO7uww_hH6PthpppTeuShn27Q,4363
|
305
309
|
airflow/providers/google/suite/transfers/local_to_drive.py,sha256=eYCJghA0Ou2vUUvN_wfBQvpt2yzR9RmmeNdPgh2Cbjo,6100
|
306
310
|
airflow/providers/google/suite/transfers/sql_to_sheets.py,sha256=sORkYSUDArRPnvi8WCiXP7YIXtpAgpEPhf8cqgpu644,5220
|
307
|
-
apache_airflow_providers_google-10.
|
308
|
-
apache_airflow_providers_google-10.
|
309
|
-
apache_airflow_providers_google-10.
|
310
|
-
apache_airflow_providers_google-10.
|
311
|
+
apache_airflow_providers_google-10.19.0rc1.dist-info/entry_points.txt,sha256=Ay1Uo7uHxdXCxWew3CyBHumZ44Ld-iR7AcSR2fY-PLw,102
|
312
|
+
apache_airflow_providers_google-10.19.0rc1.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
|
313
|
+
apache_airflow_providers_google-10.19.0rc1.dist-info/METADATA,sha256=TEL1HiGTymPKt43Emg4NAlWhXKBDlUGKVF7GtvIQeUc,15995
|
314
|
+
apache_airflow_providers_google-10.19.0rc1.dist-info/RECORD,,
|
@@ -1,81 +0,0 @@
|
|
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
|
-
"""This module contains code related to OpenLineage and lineage extraction."""
|
19
|
-
|
20
|
-
from __future__ import annotations
|
21
|
-
|
22
|
-
from typing import TYPE_CHECKING, Any
|
23
|
-
|
24
|
-
from openlineage.client.facet import (
|
25
|
-
ColumnLineageDatasetFacet,
|
26
|
-
ColumnLineageDatasetFacetFieldsAdditional,
|
27
|
-
ColumnLineageDatasetFacetFieldsAdditionalInputFields,
|
28
|
-
DocumentationDatasetFacet,
|
29
|
-
SchemaDatasetFacet,
|
30
|
-
SchemaField,
|
31
|
-
)
|
32
|
-
|
33
|
-
if TYPE_CHECKING:
|
34
|
-
from google.cloud.bigquery.table import Table
|
35
|
-
from openlineage.client.run import Dataset
|
36
|
-
|
37
|
-
|
38
|
-
def get_facets_from_bq_table(table: Table) -> dict[Any, Any]:
|
39
|
-
"""Get facets from BigQuery table object."""
|
40
|
-
facets = {
|
41
|
-
"schema": SchemaDatasetFacet(
|
42
|
-
fields=[
|
43
|
-
SchemaField(name=field.name, type=field.field_type, description=field.description)
|
44
|
-
for field in table.schema
|
45
|
-
]
|
46
|
-
),
|
47
|
-
"documentation": DocumentationDatasetFacet(description=table.description or ""),
|
48
|
-
}
|
49
|
-
|
50
|
-
return facets
|
51
|
-
|
52
|
-
|
53
|
-
def get_identity_column_lineage_facet(
|
54
|
-
field_names: list[str],
|
55
|
-
input_datasets: list[Dataset],
|
56
|
-
) -> ColumnLineageDatasetFacet:
|
57
|
-
"""
|
58
|
-
Get column lineage facet.
|
59
|
-
|
60
|
-
Simple lineage will be created, where each source column corresponds to single destination column
|
61
|
-
in each input dataset and there are no transformations made.
|
62
|
-
"""
|
63
|
-
if field_names and not input_datasets:
|
64
|
-
raise ValueError("When providing `field_names` You must provide at least one `input_dataset`.")
|
65
|
-
|
66
|
-
column_lineage_facet = ColumnLineageDatasetFacet(
|
67
|
-
fields={
|
68
|
-
field: ColumnLineageDatasetFacetFieldsAdditional(
|
69
|
-
inputFields=[
|
70
|
-
ColumnLineageDatasetFacetFieldsAdditionalInputFields(
|
71
|
-
namespace=dataset.namespace, name=dataset.name, field=field
|
72
|
-
)
|
73
|
-
for dataset in input_datasets
|
74
|
-
],
|
75
|
-
transformationType="IDENTITY",
|
76
|
-
transformationDescription="identical",
|
77
|
-
)
|
78
|
-
for field in field_names
|
79
|
-
}
|
80
|
-
)
|
81
|
-
return column_lineage_facet
|
File without changes
|