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.
Files changed (174) hide show
  1. airflow/providers/google/__init__.py +1 -1
  2. airflow/providers/google/ads/hooks/ads.py +10 -6
  3. airflow/providers/google/cloud/_internal_client/secret_manager_client.py +4 -1
  4. airflow/providers/google/cloud/example_dags/example_cloud_sql_query.py +31 -34
  5. airflow/providers/google/cloud/hooks/automl.py +11 -9
  6. airflow/providers/google/cloud/hooks/bigquery.py +30 -36
  7. airflow/providers/google/cloud/hooks/bigquery_dts.py +5 -3
  8. airflow/providers/google/cloud/hooks/bigtable.py +11 -8
  9. airflow/providers/google/cloud/hooks/cloud_batch.py +5 -3
  10. airflow/providers/google/cloud/hooks/cloud_build.py +6 -4
  11. airflow/providers/google/cloud/hooks/cloud_composer.py +14 -10
  12. airflow/providers/google/cloud/hooks/cloud_memorystore.py +5 -3
  13. airflow/providers/google/cloud/hooks/cloud_run.py +5 -3
  14. airflow/providers/google/cloud/hooks/cloud_sql.py +11 -14
  15. airflow/providers/google/cloud/hooks/cloud_storage_transfer_service.py +8 -6
  16. airflow/providers/google/cloud/hooks/compute.py +5 -3
  17. airflow/providers/google/cloud/hooks/compute_ssh.py +1 -1
  18. airflow/providers/google/cloud/hooks/datacatalog.py +5 -3
  19. airflow/providers/google/cloud/hooks/dataflow.py +8 -11
  20. airflow/providers/google/cloud/hooks/dataform.py +4 -2
  21. airflow/providers/google/cloud/hooks/datafusion.py +24 -6
  22. airflow/providers/google/cloud/hooks/dataplex.py +75 -6
  23. airflow/providers/google/cloud/hooks/dataproc.py +9 -7
  24. airflow/providers/google/cloud/hooks/dataproc_metastore.py +8 -6
  25. airflow/providers/google/cloud/hooks/dlp.py +139 -137
  26. airflow/providers/google/cloud/hooks/gcs.py +15 -20
  27. airflow/providers/google/cloud/hooks/kms.py +4 -2
  28. airflow/providers/google/cloud/hooks/kubernetes_engine.py +34 -34
  29. airflow/providers/google/cloud/hooks/looker.py +4 -1
  30. airflow/providers/google/cloud/hooks/mlengine.py +8 -6
  31. airflow/providers/google/cloud/hooks/natural_language.py +4 -2
  32. airflow/providers/google/cloud/hooks/os_login.py +9 -7
  33. airflow/providers/google/cloud/hooks/pubsub.py +13 -11
  34. airflow/providers/google/cloud/hooks/spanner.py +7 -5
  35. airflow/providers/google/cloud/hooks/speech_to_text.py +4 -2
  36. airflow/providers/google/cloud/hooks/stackdriver.py +6 -5
  37. airflow/providers/google/cloud/hooks/tasks.py +5 -3
  38. airflow/providers/google/cloud/hooks/text_to_speech.py +4 -2
  39. airflow/providers/google/cloud/hooks/vertex_ai/auto_ml.py +7 -5
  40. airflow/providers/google/cloud/hooks/vertex_ai/batch_prediction_job.py +6 -4
  41. airflow/providers/google/cloud/hooks/vertex_ai/custom_job.py +11 -9
  42. airflow/providers/google/cloud/hooks/vertex_ai/dataset.py +12 -10
  43. airflow/providers/google/cloud/hooks/vertex_ai/endpoint_service.py +8 -6
  44. airflow/providers/google/cloud/hooks/vertex_ai/hyperparameter_tuning_job.py +6 -4
  45. airflow/providers/google/cloud/hooks/vertex_ai/model_service.py +7 -5
  46. airflow/providers/google/cloud/hooks/video_intelligence.py +5 -3
  47. airflow/providers/google/cloud/hooks/vision.py +5 -3
  48. airflow/providers/google/cloud/hooks/workflows.py +8 -6
  49. airflow/providers/google/cloud/links/bigquery.py +1 -1
  50. airflow/providers/google/cloud/links/bigquery_dts.py +1 -1
  51. airflow/providers/google/cloud/links/cloud_functions.py +1 -1
  52. airflow/providers/google/cloud/links/cloud_memorystore.py +1 -1
  53. airflow/providers/google/cloud/links/cloud_sql.py +1 -1
  54. airflow/providers/google/cloud/links/cloud_tasks.py +1 -1
  55. airflow/providers/google/cloud/links/compute.py +1 -1
  56. airflow/providers/google/cloud/links/datacatalog.py +1 -1
  57. airflow/providers/google/cloud/links/dataflow.py +1 -1
  58. airflow/providers/google/cloud/links/dataform.py +1 -1
  59. airflow/providers/google/cloud/links/pubsub.py +1 -1
  60. airflow/providers/google/cloud/links/spanner.py +1 -1
  61. airflow/providers/google/cloud/links/stackdriver.py +1 -1
  62. airflow/providers/google/cloud/links/workflows.py +2 -2
  63. airflow/providers/google/cloud/log/gcs_task_handler.py +5 -7
  64. airflow/providers/google/cloud/log/stackdriver_task_handler.py +8 -4
  65. airflow/providers/google/cloud/operators/automl.py +2 -1
  66. airflow/providers/google/cloud/operators/bigquery.py +6 -2
  67. airflow/providers/google/cloud/operators/bigquery_dts.py +2 -1
  68. airflow/providers/google/cloud/operators/bigtable.py +5 -3
  69. airflow/providers/google/cloud/operators/cloud_batch.py +6 -3
  70. airflow/providers/google/cloud/operators/cloud_build.py +2 -1
  71. airflow/providers/google/cloud/operators/cloud_composer.py +3 -2
  72. airflow/providers/google/cloud/operators/cloud_memorystore.py +3 -2
  73. airflow/providers/google/cloud/operators/cloud_run.py +3 -2
  74. airflow/providers/google/cloud/operators/cloud_sql.py +157 -152
  75. airflow/providers/google/cloud/operators/compute.py +59 -61
  76. airflow/providers/google/cloud/operators/datacatalog.py +3 -2
  77. airflow/providers/google/cloud/operators/dataflow.py +3 -1
  78. airflow/providers/google/cloud/operators/dataform.py +2 -1
  79. airflow/providers/google/cloud/operators/datafusion.py +1 -1
  80. airflow/providers/google/cloud/operators/dataplex.py +110 -8
  81. airflow/providers/google/cloud/operators/dataproc.py +39 -18
  82. airflow/providers/google/cloud/operators/dataproc_metastore.py +2 -1
  83. airflow/providers/google/cloud/operators/dlp.py +3 -2
  84. airflow/providers/google/cloud/operators/functions.py +46 -46
  85. airflow/providers/google/cloud/operators/gcs.py +4 -6
  86. airflow/providers/google/cloud/operators/kubernetes_engine.py +2 -1
  87. airflow/providers/google/cloud/operators/natural_language.py +3 -2
  88. airflow/providers/google/cloud/operators/pubsub.py +2 -1
  89. airflow/providers/google/cloud/operators/speech_to_text.py +3 -2
  90. airflow/providers/google/cloud/operators/stackdriver.py +2 -1
  91. airflow/providers/google/cloud/operators/tasks.py +3 -2
  92. airflow/providers/google/cloud/operators/text_to_speech.py +3 -2
  93. airflow/providers/google/cloud/operators/translate_speech.py +2 -1
  94. airflow/providers/google/cloud/operators/vertex_ai/auto_ml.py +2 -1
  95. airflow/providers/google/cloud/operators/vertex_ai/batch_prediction_job.py +3 -2
  96. airflow/providers/google/cloud/operators/vertex_ai/custom_job.py +2 -1
  97. airflow/providers/google/cloud/operators/vertex_ai/dataset.py +3 -2
  98. airflow/providers/google/cloud/operators/vertex_ai/endpoint_service.py +4 -4
  99. airflow/providers/google/cloud/operators/vertex_ai/hyperparameter_tuning_job.py +3 -2
  100. airflow/providers/google/cloud/operators/vertex_ai/model_service.py +2 -1
  101. airflow/providers/google/cloud/operators/video_intelligence.py +2 -1
  102. airflow/providers/google/cloud/operators/vision.py +3 -2
  103. airflow/providers/google/cloud/operators/workflows.py +7 -5
  104. airflow/providers/google/cloud/secrets/secret_manager.py +2 -2
  105. airflow/providers/google/cloud/sensors/bigquery_dts.py +2 -1
  106. airflow/providers/google/cloud/sensors/dataplex.py +2 -1
  107. airflow/providers/google/cloud/sensors/dataproc_metastore.py +2 -2
  108. airflow/providers/google/cloud/sensors/gcs.py +2 -1
  109. airflow/providers/google/cloud/sensors/workflows.py +2 -1
  110. airflow/providers/google/cloud/transfers/azure_fileshare_to_gcs.py +24 -10
  111. airflow/providers/google/cloud/transfers/bigquery_to_gcs.py +2 -1
  112. airflow/providers/google/cloud/transfers/bigquery_to_mssql.py +2 -1
  113. airflow/providers/google/cloud/transfers/bigquery_to_mysql.py +1 -4
  114. airflow/providers/google/cloud/transfers/bigquery_to_postgres.py +1 -4
  115. airflow/providers/google/cloud/transfers/bigquery_to_sql.py +1 -1
  116. airflow/providers/google/cloud/transfers/calendar_to_gcs.py +4 -2
  117. airflow/providers/google/cloud/transfers/cassandra_to_gcs.py +1 -3
  118. airflow/providers/google/cloud/transfers/facebook_ads_to_gcs.py +2 -2
  119. airflow/providers/google/cloud/transfers/gcs_to_bigquery.py +2 -1
  120. airflow/providers/google/cloud/transfers/presto_to_gcs.py +5 -4
  121. airflow/providers/google/cloud/transfers/sql_to_gcs.py +1 -1
  122. airflow/providers/google/cloud/transfers/trino_to_gcs.py +5 -4
  123. airflow/providers/google/cloud/triggers/bigquery.py +30 -36
  124. airflow/providers/google/cloud/triggers/bigquery_dts.py +9 -10
  125. airflow/providers/google/cloud/triggers/cloud_batch.py +6 -8
  126. airflow/providers/google/cloud/triggers/cloud_build.py +5 -6
  127. airflow/providers/google/cloud/triggers/cloud_run.py +4 -3
  128. airflow/providers/google/cloud/triggers/cloud_sql.py +10 -10
  129. airflow/providers/google/cloud/triggers/cloud_storage_transfer_service.py +1 -1
  130. airflow/providers/google/cloud/triggers/dataflow.py +5 -6
  131. airflow/providers/google/cloud/triggers/datafusion.py +5 -6
  132. airflow/providers/google/cloud/triggers/dataplex.py +110 -0
  133. airflow/providers/google/cloud/triggers/dataproc.py +18 -20
  134. airflow/providers/google/cloud/triggers/kubernetes_engine.py +14 -13
  135. airflow/providers/google/cloud/triggers/mlengine.py +5 -5
  136. airflow/providers/google/cloud/triggers/pubsub.py +2 -2
  137. airflow/providers/google/cloud/utils/bigquery_get_data.py +6 -3
  138. airflow/providers/google/cloud/utils/credentials_provider.py +1 -1
  139. airflow/providers/google/cloud/utils/field_validator.py +13 -13
  140. airflow/providers/google/cloud/utils/mlengine_operator_utils.py +5 -3
  141. airflow/providers/google/cloud/utils/mlengine_prediction_summary.py +1 -1
  142. airflow/providers/google/common/hooks/base_google.py +10 -2
  143. airflow/providers/google/common/links/storage.py +1 -1
  144. airflow/providers/google/common/utils/id_token_credentials.py +4 -1
  145. airflow/providers/google/get_provider_info.py +5 -0
  146. airflow/providers/google/marketing_platform/hooks/campaign_manager.py +4 -2
  147. airflow/providers/google/marketing_platform/sensors/display_video.py +6 -3
  148. airflow/providers/google/suite/hooks/calendar.py +4 -2
  149. {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/METADATA +8 -8
  150. {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/RECORD +155 -173
  151. {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/WHEEL +1 -1
  152. airflow/providers/google/ads/_vendor/__init__.py +0 -16
  153. airflow/providers/google/ads/_vendor/googleads/__init__.py +0 -16
  154. airflow/providers/google/ads/_vendor/googleads/interceptors/__init__.py +0 -16
  155. airflow/providers/google/ads/_vendor/googleads/v12/__init__.py +0 -16
  156. airflow/providers/google/ads/_vendor/googleads/v12/common/__init__.py +0 -16
  157. airflow/providers/google/ads/_vendor/googleads/v12/common/types/__init__.py +0 -16
  158. airflow/providers/google/ads/_vendor/googleads/v12/enums/__init__.py +0 -16
  159. airflow/providers/google/ads/_vendor/googleads/v12/enums/types/__init__.py +0 -16
  160. airflow/providers/google/ads/_vendor/googleads/v12/errors/__init__.py +0 -16
  161. airflow/providers/google/ads/_vendor/googleads/v12/errors/types/__init__.py +0 -16
  162. airflow/providers/google/ads/_vendor/googleads/v12/resources/__init__.py +0 -16
  163. airflow/providers/google/ads/_vendor/googleads/v12/resources/types/__init__.py +0 -16
  164. airflow/providers/google/ads/_vendor/googleads/v12/services/__init__.py +0 -16
  165. airflow/providers/google/ads/_vendor/googleads/v12/services/services/__init__.py +0 -16
  166. airflow/providers/google/ads/_vendor/googleads/v12/services/services/customer_service/__init__.py +0 -16
  167. airflow/providers/google/ads/_vendor/googleads/v12/services/services/customer_service/transports/__init__.py +0 -16
  168. airflow/providers/google/ads/_vendor/googleads/v12/services/services/google_ads_service/__init__.py +0 -16
  169. airflow/providers/google/ads/_vendor/googleads/v12/services/services/google_ads_service/transports/__init__.py +0 -16
  170. airflow/providers/google/ads/_vendor/googleads/v12/services/types/__init__.py +0 -16
  171. {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/LICENSE +0 -0
  172. {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/NOTICE +0 -0
  173. {apache_airflow_providers_google-10.7.0rc1.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/entry_points.txt +0 -0
  174. {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 = dict(key="ssh-keys", value=keys)
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.match(r"^[a-z]([-a-z0-9]*[a-z0-9])?$", base_job_name):
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
- dict(
1240
- project_id=project_id,
1241
- job_id=job_id,
1242
- view=job_view,
1243
- location=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
- continue
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.api_core.operation import Operation
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."""