apache-airflow-providers-google 10.7.0rc1__py3-none-any.whl → 10.8.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/__init__.py +1 -1
- airflow/providers/google/ads/hooks/ads.py +10 -6
- airflow/providers/google/cloud/_internal_client/secret_manager_client.py +4 -1
- airflow/providers/google/cloud/example_dags/example_cloud_sql_query.py +31 -34
- airflow/providers/google/cloud/hooks/automl.py +11 -9
- airflow/providers/google/cloud/hooks/bigquery.py +30 -36
- airflow/providers/google/cloud/hooks/bigquery_dts.py +5 -3
- airflow/providers/google/cloud/hooks/bigtable.py +11 -8
- airflow/providers/google/cloud/hooks/cloud_batch.py +5 -3
- airflow/providers/google/cloud/hooks/cloud_build.py +6 -4
- airflow/providers/google/cloud/hooks/cloud_composer.py +14 -10
- airflow/providers/google/cloud/hooks/cloud_memorystore.py +5 -3
- airflow/providers/google/cloud/hooks/cloud_run.py +5 -3
- airflow/providers/google/cloud/hooks/cloud_sql.py +11 -14
- airflow/providers/google/cloud/hooks/cloud_storage_transfer_service.py +8 -6
- airflow/providers/google/cloud/hooks/compute.py +5 -3
- airflow/providers/google/cloud/hooks/compute_ssh.py +1 -1
- airflow/providers/google/cloud/hooks/datacatalog.py +5 -3
- airflow/providers/google/cloud/hooks/dataflow.py +8 -11
- airflow/providers/google/cloud/hooks/dataform.py +4 -2
- airflow/providers/google/cloud/hooks/datafusion.py +24 -6
- airflow/providers/google/cloud/hooks/dataplex.py +75 -6
- airflow/providers/google/cloud/hooks/dataproc.py +9 -7
- airflow/providers/google/cloud/hooks/dataproc_metastore.py +8 -6
- airflow/providers/google/cloud/hooks/dlp.py +139 -137
- airflow/providers/google/cloud/hooks/gcs.py +15 -20
- airflow/providers/google/cloud/hooks/kms.py +4 -2
- airflow/providers/google/cloud/hooks/kubernetes_engine.py +34 -34
- airflow/providers/google/cloud/hooks/looker.py +4 -1
- airflow/providers/google/cloud/hooks/mlengine.py +8 -6
- airflow/providers/google/cloud/hooks/natural_language.py +4 -2
- airflow/providers/google/cloud/hooks/os_login.py +9 -7
- airflow/providers/google/cloud/hooks/pubsub.py +13 -11
- airflow/providers/google/cloud/hooks/spanner.py +7 -5
- airflow/providers/google/cloud/hooks/speech_to_text.py +4 -2
- airflow/providers/google/cloud/hooks/stackdriver.py +6 -5
- airflow/providers/google/cloud/hooks/tasks.py +5 -3
- airflow/providers/google/cloud/hooks/text_to_speech.py +4 -2
- airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +7 -5
- airflow/providers/google/cloud/hooks/vertex_ai/batch_prediction_job.py +6 -4
- airflow/providers/google/cloud/hooks/vertex_ai/custom_job.py +11 -9
- airflow/providers/google/cloud/hooks/vertex_ai/dataset.py +12 -10
- airflow/providers/google/cloud/hooks/vertex_ai/endpoint_service.py +8 -6
- airflow/providers/google/cloud/hooks/vertex_ai/hyperparameter_tuning_job.py +6 -4
- airflow/providers/google/cloud/hooks/vertex_ai/model_service.py +7 -5
- airflow/providers/google/cloud/hooks/video_intelligence.py +5 -3
- airflow/providers/google/cloud/hooks/vision.py +5 -3
- airflow/providers/google/cloud/hooks/workflows.py +8 -6
- airflow/providers/google/cloud/links/bigquery.py +1 -1
- airflow/providers/google/cloud/links/bigquery_dts.py +1 -1
- airflow/providers/google/cloud/links/cloud_functions.py +1 -1
- airflow/providers/google/cloud/links/cloud_memorystore.py +1 -1
- airflow/providers/google/cloud/links/cloud_sql.py +1 -1
- airflow/providers/google/cloud/links/cloud_tasks.py +1 -1
- airflow/providers/google/cloud/links/compute.py +1 -1
- airflow/providers/google/cloud/links/datacatalog.py +1 -1
- airflow/providers/google/cloud/links/dataflow.py +1 -1
- airflow/providers/google/cloud/links/dataform.py +1 -1
- airflow/providers/google/cloud/links/pubsub.py +1 -1
- airflow/providers/google/cloud/links/spanner.py +1 -1
- airflow/providers/google/cloud/links/stackdriver.py +1 -1
- airflow/providers/google/cloud/links/workflows.py +2 -2
- airflow/providers/google/cloud/log/gcs_task_handler.py +5 -7
- airflow/providers/google/cloud/log/stackdriver_task_handler.py +8 -4
- airflow/providers/google/cloud/operators/automl.py +2 -1
- airflow/providers/google/cloud/operators/bigquery.py +6 -2
- airflow/providers/google/cloud/operators/bigquery_dts.py +2 -1
- airflow/providers/google/cloud/operators/bigtable.py +5 -3
- airflow/providers/google/cloud/operators/cloud_batch.py +6 -3
- airflow/providers/google/cloud/operators/cloud_build.py +2 -1
- airflow/providers/google/cloud/operators/cloud_composer.py +3 -2
- airflow/providers/google/cloud/operators/cloud_memorystore.py +3 -2
- airflow/providers/google/cloud/operators/cloud_run.py +3 -2
- airflow/providers/google/cloud/operators/cloud_sql.py +157 -152
- airflow/providers/google/cloud/operators/compute.py +59 -61
- airflow/providers/google/cloud/operators/datacatalog.py +3 -2
- airflow/providers/google/cloud/operators/dataflow.py +3 -1
- airflow/providers/google/cloud/operators/dataform.py +2 -1
- airflow/providers/google/cloud/operators/datafusion.py +1 -1
- airflow/providers/google/cloud/operators/dataplex.py +110 -8
- airflow/providers/google/cloud/operators/dataproc.py +39 -18
- airflow/providers/google/cloud/operators/dataproc_metastore.py +2 -1
- airflow/providers/google/cloud/operators/dlp.py +3 -2
- airflow/providers/google/cloud/operators/functions.py +46 -46
- airflow/providers/google/cloud/operators/gcs.py +4 -6
- airflow/providers/google/cloud/operators/kubernetes_engine.py +2 -1
- airflow/providers/google/cloud/operators/natural_language.py +3 -2
- airflow/providers/google/cloud/operators/pubsub.py +2 -1
- airflow/providers/google/cloud/operators/speech_to_text.py +3 -2
- airflow/providers/google/cloud/operators/stackdriver.py +2 -1
- airflow/providers/google/cloud/operators/tasks.py +3 -2
- airflow/providers/google/cloud/operators/text_to_speech.py +3 -2
- airflow/providers/google/cloud/operators/translate_speech.py +2 -1
- airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +2 -1
- airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py +3 -2
- airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +2 -1
- airflow/providers/google/cloud/operators/vertex_ai/dataset.py +3 -2
- airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py +4 -4
- airflow/providers/google/cloud/operators/vertex_ai/hyperparameter_tuning_job.py +3 -2
- airflow/providers/google/cloud/operators/vertex_ai/model_service.py +2 -1
- airflow/providers/google/cloud/operators/video_intelligence.py +2 -1
- airflow/providers/google/cloud/operators/vision.py +3 -2
- airflow/providers/google/cloud/operators/workflows.py +7 -5
- airflow/providers/google/cloud/secrets/secret_manager.py +2 -2
- airflow/providers/google/cloud/sensors/bigquery_dts.py +2 -1
- airflow/providers/google/cloud/sensors/dataplex.py +2 -1
- airflow/providers/google/cloud/sensors/dataproc_metastore.py +2 -2
- airflow/providers/google/cloud/sensors/gcs.py +2 -1
- airflow/providers/google/cloud/sensors/workflows.py +2 -1
- airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py +24 -10
- airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +2 -1
- airflow/providers/google/cloud/transfers/bigquery_to_mssql.py +2 -1
- airflow/providers/google/cloud/transfers/bigquery_to_mysql.py +1 -4
- airflow/providers/google/cloud/transfers/bigquery_to_postgres.py +1 -4
- airflow/providers/google/cloud/transfers/bigquery_to_sql.py +1 -1
- airflow/providers/google/cloud/transfers/calendar_to_gcs.py +4 -2
- airflow/providers/google/cloud/transfers/cassandra_to_gcs.py +1 -3
- airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py +2 -2
- airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +2 -1
- airflow/providers/google/cloud/transfers/presto_to_gcs.py +5 -4
- airflow/providers/google/cloud/transfers/sql_to_gcs.py +1 -1
- airflow/providers/google/cloud/transfers/trino_to_gcs.py +5 -4
- airflow/providers/google/cloud/triggers/bigquery.py +30 -36
- airflow/providers/google/cloud/triggers/bigquery_dts.py +9 -10
- airflow/providers/google/cloud/triggers/cloud_batch.py +6 -8
- airflow/providers/google/cloud/triggers/cloud_build.py +5 -6
- airflow/providers/google/cloud/triggers/cloud_run.py +4 -3
- airflow/providers/google/cloud/triggers/cloud_sql.py +10 -10
- airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py +1 -1
- airflow/providers/google/cloud/triggers/dataflow.py +5 -6
- airflow/providers/google/cloud/triggers/datafusion.py +5 -6
- airflow/providers/google/cloud/triggers/dataplex.py +110 -0
- airflow/providers/google/cloud/triggers/dataproc.py +18 -20
- airflow/providers/google/cloud/triggers/kubernetes_engine.py +14 -13
- airflow/providers/google/cloud/triggers/mlengine.py +5 -5
- airflow/providers/google/cloud/triggers/pubsub.py +2 -2
- airflow/providers/google/cloud/utils/bigquery_get_data.py +6 -3
- airflow/providers/google/cloud/utils/credentials_provider.py +1 -1
- airflow/providers/google/cloud/utils/field_validator.py +13 -13
- airflow/providers/google/cloud/utils/mlengine_operator_utils.py +5 -3
- airflow/providers/google/cloud/utils/mlengine_prediction_summary.py +1 -1
- airflow/providers/google/common/hooks/base_google.py +10 -2
- airflow/providers/google/common/links/storage.py +1 -1
- airflow/providers/google/common/utils/id_token_credentials.py +4 -1
- airflow/providers/google/get_provider_info.py +5 -0
- airflow/providers/google/marketing_platform/hooks/campaign_manager.py +4 -2
- airflow/providers/google/marketing_platform/sensors/display_video.py +6 -3
- airflow/providers/google/suite/hooks/calendar.py +4 -2
- {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/METADATA +8 -8
- {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/RECORD +155 -173
- {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/WHEEL +1 -1
- airflow/providers/google/ads/_vendor/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/interceptors/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/common/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/common/types/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/enums/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/enums/types/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/errors/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/errors/types/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/resources/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/resources/types/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/services/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/services/services/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/services/services/customer_service/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/services/services/customer_service/transports/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/services/services/google_ads_service/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/services/services/google_ads_service/transports/__init__.py +0 -16
- airflow/providers/google/ads/_vendor/googleads/v12/services/types/__init__.py +0 -16
- {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/LICENSE +0 -0
- {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/NOTICE +0 -0
- {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/entry_points.txt +0 -0
- {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/top_level.txt +0 -0
@@ -19,18 +19,20 @@
|
|
19
19
|
from __future__ import annotations
|
20
20
|
|
21
21
|
import time
|
22
|
-
from typing import Any, Sequence
|
22
|
+
from typing import TYPE_CHECKING, Any, Sequence
|
23
23
|
|
24
|
-
from google.api_core.retry import Retry
|
25
24
|
from google.cloud.compute_v1.services.instance_group_managers import InstanceGroupManagersClient
|
26
25
|
from google.cloud.compute_v1.services.instance_templates import InstanceTemplatesClient
|
27
26
|
from google.cloud.compute_v1.services.instances import InstancesClient
|
28
|
-
from google.cloud.compute_v1.types import Instance, InstanceGroupManager, InstanceTemplate
|
29
27
|
from googleapiclient.discovery import build
|
30
28
|
|
31
29
|
from airflow.exceptions import AirflowException
|
32
30
|
from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID, GoogleBaseHook
|
33
31
|
|
32
|
+
if TYPE_CHECKING:
|
33
|
+
from google.api_core.retry import Retry
|
34
|
+
from google.cloud.compute_v1.types import Instance, InstanceGroupManager, InstanceTemplate
|
35
|
+
|
34
36
|
# Time to sleep between active checks of the operation results
|
35
37
|
TIME_TO_SLEEP_IN_SECONDS = 1
|
36
38
|
|
@@ -314,7 +314,7 @@ class ComputeEngineSSHHook(SSHHook):
|
|
314
314
|
item["value"] = keys
|
315
315
|
break
|
316
316
|
else:
|
317
|
-
new_dict =
|
317
|
+
new_dict = {"key": "ssh-keys", "value": keys}
|
318
318
|
metadata["items"] = [new_dict]
|
319
319
|
|
320
320
|
self._compute_hook.set_instance_metadata(
|
@@ -16,10 +16,9 @@
|
|
16
16
|
# under the License.
|
17
17
|
from __future__ import annotations
|
18
18
|
|
19
|
-
from typing import Sequence
|
19
|
+
from typing import TYPE_CHECKING, Sequence
|
20
20
|
|
21
21
|
from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
|
22
|
-
from google.api_core.retry import Retry
|
23
22
|
from google.cloud import datacatalog
|
24
23
|
from google.cloud.datacatalog import (
|
25
24
|
CreateTagRequest,
|
@@ -31,12 +30,15 @@ from google.cloud.datacatalog import (
|
|
31
30
|
TagTemplate,
|
32
31
|
TagTemplateField,
|
33
32
|
)
|
34
|
-
from google.protobuf.field_mask_pb2 import FieldMask
|
35
33
|
|
36
34
|
from airflow import AirflowException
|
37
35
|
from airflow.providers.google.common.consts import CLIENT_INFO
|
38
36
|
from airflow.providers.google.common.hooks.base_google import PROVIDE_PROJECT_ID, GoogleBaseHook
|
39
37
|
|
38
|
+
if TYPE_CHECKING:
|
39
|
+
from google.api_core.retry import Retry
|
40
|
+
from google.protobuf.field_mask_pb2 import FieldMask
|
41
|
+
|
40
42
|
|
41
43
|
class CloudDataCatalogHook(GoogleBaseHook):
|
42
44
|
"""
|
@@ -226,10 +226,7 @@ class _DataflowJobsController(LoggingMixin):
|
|
226
226
|
if not self._jobs:
|
227
227
|
return False
|
228
228
|
|
229
|
-
for job in self._jobs
|
230
|
-
if job["currentState"] not in DataflowJobStatus.TERMINAL_STATES:
|
231
|
-
return True
|
232
|
-
return False
|
229
|
+
return any(job["currentState"] not in DataflowJobStatus.TERMINAL_STATES for job in self._jobs)
|
233
230
|
|
234
231
|
def _get_current_jobs(self) -> list[dict]:
|
235
232
|
"""
|
@@ -870,7 +867,7 @@ class DataflowHook(GoogleBaseHook):
|
|
870
867
|
"""Builds Dataflow job name."""
|
871
868
|
base_job_name = str(job_name).replace("_", "-")
|
872
869
|
|
873
|
-
if not re.
|
870
|
+
if not re.fullmatch(r"[a-z]([-a-z0-9]*[a-z0-9])?", base_job_name):
|
874
871
|
raise ValueError(
|
875
872
|
f"Invalid job_name ({base_job_name}); the name must consist of only the characters "
|
876
873
|
f"[-a-z0-9], starting with a letter and ending with a letter or number "
|
@@ -1236,12 +1233,12 @@ class AsyncDataflowHook(GoogleBaseAsyncHook):
|
|
1236
1233
|
client = await self.initialize_client(JobsV1Beta3AsyncClient)
|
1237
1234
|
|
1238
1235
|
request = GetJobRequest(
|
1239
|
-
|
1240
|
-
project_id
|
1241
|
-
job_id
|
1242
|
-
view
|
1243
|
-
location
|
1244
|
-
|
1236
|
+
{
|
1237
|
+
"project_id": project_id,
|
1238
|
+
"job_id": job_id,
|
1239
|
+
"view": job_view,
|
1240
|
+
"location": location,
|
1241
|
+
}
|
1245
1242
|
)
|
1246
1243
|
|
1247
1244
|
job = await client.get_job(
|
@@ -17,10 +17,9 @@
|
|
17
17
|
from __future__ import annotations
|
18
18
|
|
19
19
|
import time
|
20
|
-
from typing import Sequence
|
20
|
+
from typing import TYPE_CHECKING, Sequence
|
21
21
|
|
22
22
|
from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
|
23
|
-
from google.api_core.retry import Retry
|
24
23
|
from google.cloud.dataform_v1beta1 import DataformClient
|
25
24
|
from google.cloud.dataform_v1beta1.types import (
|
26
25
|
CompilationResult,
|
@@ -34,6 +33,9 @@ from google.cloud.dataform_v1beta1.types import (
|
|
34
33
|
from airflow import AirflowException
|
35
34
|
from airflow.providers.google.common.hooks.base_google import GoogleBaseHook
|
36
35
|
|
36
|
+
if TYPE_CHECKING:
|
37
|
+
from google.api_core.retry import Retry
|
38
|
+
|
37
39
|
|
38
40
|
class DataformHook(GoogleBaseHook):
|
39
41
|
"""Hook for Google Cloud DataForm APIs."""
|
@@ -17,6 +17,7 @@
|
|
17
17
|
"""This module contains Google DataFusion hook."""
|
18
18
|
from __future__ import annotations
|
19
19
|
|
20
|
+
import asyncio
|
20
21
|
import json
|
21
22
|
import os
|
22
23
|
from time import monotonic, sleep
|
@@ -152,7 +153,7 @@ class DataFusionHook(GoogleBaseHook):
|
|
152
153
|
return os.path.join(instance_url, "v3", "namespaces", quote(namespace), "apps")
|
153
154
|
|
154
155
|
def _cdap_request(
|
155
|
-
self, url: str, method: str, body: list | dict | None = None
|
156
|
+
self, url: str, method: str, body: list | dict | None = None, params: dict | None = None
|
156
157
|
) -> google.auth.transport.Response:
|
157
158
|
headers: dict[str, str] = {"Content-Type": "application/json"}
|
158
159
|
request = google.auth.transport.requests.Request()
|
@@ -162,7 +163,7 @@ class DataFusionHook(GoogleBaseHook):
|
|
162
163
|
|
163
164
|
payload = json.dumps(body) if body else None
|
164
165
|
|
165
|
-
response = request(method=method, url=url, headers=headers, body=payload)
|
166
|
+
response = request(method=method, url=url, headers=headers, body=payload, params=params)
|
166
167
|
return response
|
167
168
|
|
168
169
|
@staticmethod
|
@@ -281,6 +282,23 @@ class DataFusionHook(GoogleBaseHook):
|
|
281
282
|
)
|
282
283
|
return instance
|
283
284
|
|
285
|
+
def get_instance_artifacts(
|
286
|
+
self, instance_url: str, namespace: str = "default", scope: str = "SYSTEM"
|
287
|
+
) -> Any:
|
288
|
+
url = os.path.join(
|
289
|
+
instance_url,
|
290
|
+
"v3",
|
291
|
+
"namespaces",
|
292
|
+
quote(namespace),
|
293
|
+
"artifacts",
|
294
|
+
)
|
295
|
+
response = self._cdap_request(url=url, method="GET", params={"scope": scope})
|
296
|
+
self._check_response_status_and_data(
|
297
|
+
response, f"Retrieving an instance artifacts failed with code {response.status}"
|
298
|
+
)
|
299
|
+
content = json.loads(response.data)
|
300
|
+
return content
|
301
|
+
|
284
302
|
@GoogleBaseHook.fallback_to_default_project_id
|
285
303
|
def patch_instance(
|
286
304
|
self,
|
@@ -370,12 +388,12 @@ class DataFusionHook(GoogleBaseHook):
|
|
370
388
|
self._check_response_status_and_data(
|
371
389
|
response, f"Deleting a pipeline failed with code {response.status}: {response.data}"
|
372
390
|
)
|
373
|
-
if response.status == 200:
|
374
|
-
break
|
375
391
|
except ConflictException as exc:
|
376
392
|
self.log.info(exc)
|
377
393
|
sleep(time_to_wait)
|
378
|
-
|
394
|
+
else:
|
395
|
+
if response.status == 200:
|
396
|
+
break
|
379
397
|
|
380
398
|
def list_pipelines(
|
381
399
|
self,
|
@@ -528,7 +546,7 @@ class DataFusionAsyncHook(GoogleBaseAsyncHook):
|
|
528
546
|
break
|
529
547
|
except Exception as exc:
|
530
548
|
if "404" in str(exc):
|
531
|
-
sleep(time_to_wait)
|
549
|
+
await asyncio.sleep(time_to_wait)
|
532
550
|
else:
|
533
551
|
raise
|
534
552
|
if pipeline:
|
@@ -18,13 +18,11 @@
|
|
18
18
|
from __future__ import annotations
|
19
19
|
|
20
20
|
import time
|
21
|
-
from typing import Any, Sequence
|
21
|
+
from typing import TYPE_CHECKING, Any, Sequence
|
22
22
|
|
23
23
|
from google.api_core.client_options import ClientOptions
|
24
24
|
from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
|
25
|
-
from google.
|
26
|
-
from google.api_core.retry import Retry
|
27
|
-
from google.cloud.dataplex_v1 import DataplexServiceClient, DataScanServiceClient
|
25
|
+
from google.cloud.dataplex_v1 import DataplexServiceClient, DataScanServiceAsyncClient, DataScanServiceClient
|
28
26
|
from google.cloud.dataplex_v1.types import (
|
29
27
|
Asset,
|
30
28
|
DataScan,
|
@@ -34,11 +32,15 @@ from google.cloud.dataplex_v1.types import (
|
|
34
32
|
Zone,
|
35
33
|
)
|
36
34
|
from google.protobuf.field_mask_pb2 import FieldMask
|
37
|
-
from googleapiclient.discovery import Resource
|
38
35
|
|
39
36
|
from airflow.exceptions import AirflowException
|
40
37
|
from airflow.providers.google.common.consts import CLIENT_INFO
|
41
|
-
from airflow.providers.google.common.hooks.base_google import GoogleBaseHook
|
38
|
+
from airflow.providers.google.common.hooks.base_google import GoogleBaseAsyncHook, GoogleBaseHook
|
39
|
+
|
40
|
+
if TYPE_CHECKING:
|
41
|
+
from google.api_core.operation import Operation
|
42
|
+
from google.api_core.retry import Retry
|
43
|
+
from googleapiclient.discovery import Resource
|
42
44
|
|
43
45
|
PATH_DATA_SCAN = "projects/{project_id}/locations/{region}/dataScans/{data_scan_id}"
|
44
46
|
|
@@ -857,3 +859,70 @@ class DataplexHook(GoogleBaseHook):
|
|
857
859
|
metadata=metadata,
|
858
860
|
)
|
859
861
|
return result
|
862
|
+
|
863
|
+
|
864
|
+
class DataplexAsyncHook(GoogleBaseAsyncHook):
|
865
|
+
"""
|
866
|
+
Asynchronous Hook for Google Cloud Dataplex APIs.
|
867
|
+
|
868
|
+
All the methods in the hook where project_id is used must be called with
|
869
|
+
keyword arguments rather than positional.
|
870
|
+
"""
|
871
|
+
|
872
|
+
sync_hook_class = DataplexHook
|
873
|
+
|
874
|
+
def __init__(
|
875
|
+
self,
|
876
|
+
gcp_conn_id: str = "google_cloud_default",
|
877
|
+
impersonation_chain: str | Sequence[str] | None = None,
|
878
|
+
**kwargs,
|
879
|
+
) -> None:
|
880
|
+
|
881
|
+
super().__init__(gcp_conn_id=gcp_conn_id, impersonation_chain=impersonation_chain)
|
882
|
+
|
883
|
+
async def get_dataplex_data_scan_client(self) -> DataScanServiceAsyncClient:
|
884
|
+
"""Returns DataScanServiceAsyncClient."""
|
885
|
+
client_options = ClientOptions(api_endpoint="dataplex.googleapis.com:443")
|
886
|
+
|
887
|
+
return DataScanServiceAsyncClient(
|
888
|
+
credentials=(await self.get_sync_hook()).get_credentials(),
|
889
|
+
client_info=CLIENT_INFO,
|
890
|
+
client_options=client_options,
|
891
|
+
)
|
892
|
+
|
893
|
+
@GoogleBaseHook.fallback_to_default_project_id
|
894
|
+
async def get_data_scan_job(
|
895
|
+
self,
|
896
|
+
project_id: str,
|
897
|
+
region: str,
|
898
|
+
data_scan_id: str | None = None,
|
899
|
+
job_id: str | None = None,
|
900
|
+
retry: Retry | _MethodDefault = DEFAULT,
|
901
|
+
timeout: float | None = None,
|
902
|
+
metadata: Sequence[tuple[str, str]] = (),
|
903
|
+
) -> Any:
|
904
|
+
"""
|
905
|
+
Gets a DataScan Job resource.
|
906
|
+
|
907
|
+
:param project_id: Required. The ID of the Google Cloud project that the lake belongs to.
|
908
|
+
:param region: Required. The ID of the Google Cloud region that the lake belongs to.
|
909
|
+
:param data_scan_id: Required. DataScan identifier.
|
910
|
+
:param job_id: Required. The resource name of the DataScanJob:
|
911
|
+
projects/{project_id}/locations/{region}/dataScans/{data_scan_id}/jobs/{data_scan_job_id}
|
912
|
+
:param retry: A retry object used to retry requests. If `None` is specified, requests
|
913
|
+
will not be retried.
|
914
|
+
:param timeout: The amount of time, in seconds, to wait for the request to complete.
|
915
|
+
Note that if `retry` is specified, the timeout applies to each individual attempt.
|
916
|
+
:param metadata: Additional metadata that is provided to the method.
|
917
|
+
"""
|
918
|
+
client = await self.get_dataplex_data_scan_client()
|
919
|
+
|
920
|
+
name = f"projects/{project_id}/locations/{region}/dataScans/{data_scan_id}/jobs/{job_id}"
|
921
|
+
result = await client.get_data_scan_job(
|
922
|
+
request={"name": name, "view": "FULL"},
|
923
|
+
retry=retry,
|
924
|
+
timeout=timeout,
|
925
|
+
metadata=metadata,
|
926
|
+
)
|
927
|
+
|
928
|
+
return result
|
@@ -20,15 +20,11 @@ from __future__ import annotations
|
|
20
20
|
|
21
21
|
import time
|
22
22
|
import uuid
|
23
|
-
from typing import Any, Sequence
|
23
|
+
from typing import TYPE_CHECKING, Any, Sequence
|
24
24
|
|
25
25
|
from google.api_core.client_options import ClientOptions
|
26
26
|
from google.api_core.exceptions import ServerError
|
27
27
|
from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
|
28
|
-
from google.api_core.operation import Operation
|
29
|
-
from google.api_core.operation_async import AsyncOperation
|
30
|
-
from google.api_core.operations_v1.operations_client import OperationsClient
|
31
|
-
from google.api_core.retry import Retry
|
32
28
|
from google.cloud.dataproc_v1 import (
|
33
29
|
Batch,
|
34
30
|
BatchControllerAsyncClient,
|
@@ -44,14 +40,20 @@ from google.cloud.dataproc_v1 import (
|
|
44
40
|
WorkflowTemplateServiceAsyncClient,
|
45
41
|
WorkflowTemplateServiceClient,
|
46
42
|
)
|
47
|
-
from google.protobuf.duration_pb2 import Duration
|
48
|
-
from google.protobuf.field_mask_pb2 import FieldMask
|
49
43
|
|
50
44
|
from airflow.exceptions import AirflowException
|
51
45
|
from airflow.providers.google.common.consts import CLIENT_INFO
|
52
46
|
from airflow.providers.google.common.hooks.base_google import GoogleBaseHook
|
53
47
|
from airflow.version import version as airflow_version
|
54
48
|
|
49
|
+
if TYPE_CHECKING:
|
50
|
+
from google.api_core.operation import Operation
|
51
|
+
from google.api_core.operation_async import AsyncOperation
|
52
|
+
from google.api_core.operations_v1.operations_client import OperationsClient
|
53
|
+
from google.api_core.retry import Retry
|
54
|
+
from google.protobuf.duration_pb2 import Duration
|
55
|
+
from google.protobuf.field_mask_pb2 import FieldMask
|
56
|
+
|
55
57
|
|
56
58
|
class DataProcJobBuilder:
|
57
59
|
"""A helper class for building Dataproc job."""
|
@@ -18,21 +18,23 @@
|
|
18
18
|
"""This module contains a Google Cloud Dataproc Metastore hook."""
|
19
19
|
from __future__ import annotations
|
20
20
|
|
21
|
-
from typing import Any, Sequence
|
21
|
+
from typing import TYPE_CHECKING, Any, Sequence
|
22
22
|
|
23
23
|
from google.api_core.client_options import ClientOptions
|
24
24
|
from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
|
25
|
-
from google.api_core.operation import Operation
|
26
|
-
from google.api_core.retry import Retry
|
27
25
|
from google.cloud.metastore_v1 import DataprocMetastoreClient
|
28
|
-
from google.cloud.metastore_v1.types import Backup, MetadataImport, Service
|
29
|
-
from google.cloud.metastore_v1.types.metastore import DatabaseDumpSpec, Restore
|
30
|
-
from google.protobuf.field_mask_pb2 import FieldMask
|
31
26
|
|
32
27
|
from airflow.exceptions import AirflowException
|
33
28
|
from airflow.providers.google.common.consts import CLIENT_INFO
|
34
29
|
from airflow.providers.google.common.hooks.base_google import GoogleBaseHook
|
35
30
|
|
31
|
+
if TYPE_CHECKING:
|
32
|
+
from google.api_core.operation import Operation
|
33
|
+
from google.api_core.retry import Retry
|
34
|
+
from google.cloud.metastore_v1.types import Backup, MetadataImport, Service
|
35
|
+
from google.cloud.metastore_v1.types.metastore import DatabaseDumpSpec, Restore
|
36
|
+
from google.protobuf.field_mask_pb2 import FieldMask
|
37
|
+
|
36
38
|
|
37
39
|
class DataprocMetastoreHook(GoogleBaseHook):
|
38
40
|
"""Hook for Google Cloud Dataproc Metastore APIs."""
|