apache-airflow-providers-google 10.7.0__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.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/METADATA +6 -6
  150. {apache_airflow_providers_google-10.7.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/RECORD +155 -173
  151. {apache_airflow_providers_google-10.7.0.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.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/LICENSE +0 -0
  172. {apache_airflow_providers_google-10.7.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/NOTICE +0 -0
  173. {apache_airflow_providers_google-10.7.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/entry_points.txt +0 -0
  174. {apache_airflow_providers_google-10.7.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/top_level.txt +0 -0
@@ -25,7 +25,6 @@ from googleapiclient.errors import HttpError
25
25
  from airflow.configuration import conf
26
26
  from airflow.exceptions import AirflowException
27
27
  from airflow.hooks.base import BaseHook
28
- from airflow.models import Connection
29
28
  from airflow.providers.google.cloud.hooks.cloud_sql import CloudSQLDatabaseHook, CloudSQLHook
30
29
  from airflow.providers.google.cloud.links.cloud_sql import CloudSQLInstanceDatabaseLink, CloudSQLInstanceLink
31
30
  from airflow.providers.google.cloud.operators.cloud_base import GoogleCloudBaseOperator
@@ -33,10 +32,11 @@ from airflow.providers.google.cloud.triggers.cloud_sql import CloudSQLExportTrig
33
32
  from airflow.providers.google.cloud.utils.field_validator import GcpBodyFieldValidator
34
33
  from airflow.providers.google.common.hooks.base_google import get_field
35
34
  from airflow.providers.google.common.links.storage import FileDetailsLink
36
- from airflow.providers.mysql.hooks.mysql import MySqlHook
37
- from airflow.providers.postgres.hooks.postgres import PostgresHook
38
35
 
39
36
  if TYPE_CHECKING:
37
+ from airflow.models import Connection
38
+ from airflow.providers.mysql.hooks.mysql import MySqlHook
39
+ from airflow.providers.postgres.hooks.postgres import PostgresHook
40
40
  from airflow.utils.context import Context
41
41
 
42
42
 
@@ -44,175 +44,180 @@ SETTINGS = "settings"
44
44
  SETTINGS_VERSION = "settingsVersion"
45
45
 
46
46
  CLOUD_SQL_CREATE_VALIDATION: Sequence[dict] = [
47
- dict(name="name", allow_empty=False),
48
- dict(
49
- name="settings",
50
- type="dict",
51
- fields=[
52
- dict(name="tier", allow_empty=False),
53
- dict(
54
- name="backupConfiguration",
55
- type="dict",
56
- fields=[
57
- dict(name="binaryLogEnabled", optional=True),
58
- dict(name="enabled", optional=True),
59
- dict(name="replicationLogArchivingEnabled", optional=True),
60
- dict(name="startTime", allow_empty=False, optional=True),
47
+ {"name": "name", "allow_empty": False},
48
+ {
49
+ "name": "settings",
50
+ "type": "dict",
51
+ "fields": [
52
+ {"name": "tier", "allow_empty": False},
53
+ {
54
+ "name": "backupConfiguration",
55
+ "type": "dict",
56
+ "fields": [
57
+ {"name": "binaryLogEnabled", "optional": True},
58
+ {"name": "enabled", "optional": True},
59
+ {"name": "replicationLogArchivingEnabled", "optional": True},
60
+ {"name": "startTime", "allow_empty": False, "optional": True},
61
61
  ],
62
- optional=True,
63
- ),
64
- dict(name="activationPolicy", allow_empty=False, optional=True),
65
- dict(name="authorizedGaeApplications", type="list", optional=True),
66
- dict(name="crashSafeReplicationEnabled", optional=True),
67
- dict(name="dataDiskSizeGb", optional=True),
68
- dict(name="dataDiskType", allow_empty=False, optional=True),
69
- dict(name="databaseFlags", type="list", optional=True),
70
- dict(
71
- name="ipConfiguration",
72
- type="dict",
73
- fields=[
74
- dict(
75
- name="authorizedNetworks",
76
- type="list",
77
- fields=[
78
- dict(name="expirationTime", optional=True),
79
- dict(name="name", allow_empty=False, optional=True),
80
- dict(name="value", allow_empty=False, optional=True),
62
+ "optional": True,
63
+ },
64
+ {"name": "activationPolicy", "allow_empty": False, "optional": True},
65
+ {"name": "authorizedGaeApplications", "type": "list", "optional": True},
66
+ {"name": "crashSafeReplicationEnabled", "optional": True},
67
+ {"name": "dataDiskSizeGb", "optional": True},
68
+ {"name": "dataDiskType", "allow_empty": False, "optional": True},
69
+ {"name": "databaseFlags", "type": "list", "optional": True},
70
+ {
71
+ "name": "ipConfiguration",
72
+ "type": "dict",
73
+ "fields": [
74
+ {
75
+ "name": "authorizedNetworks",
76
+ "type": "list",
77
+ "fields": [
78
+ {"name": "expirationTime", "optional": True},
79
+ {"name": "name", "allow_empty": False, "optional": True},
80
+ {"name": "value", "allow_empty": False, "optional": True},
81
81
  ],
82
- optional=True,
83
- ),
84
- dict(name="ipv4Enabled", optional=True),
85
- dict(name="privateNetwork", allow_empty=False, optional=True),
86
- dict(name="requireSsl", optional=True),
82
+ "optional": True,
83
+ },
84
+ {"name": "ipv4Enabled", "optional": True},
85
+ {"name": "privateNetwork", "allow_empty": False, "optional": True},
86
+ {"name": "requireSsl", "optional": True},
87
87
  ],
88
- optional=True,
89
- ),
90
- dict(
91
- name="locationPreference",
92
- type="dict",
93
- fields=[
94
- dict(name="followGaeApplication", allow_empty=False, optional=True),
95
- dict(name="zone", allow_empty=False, optional=True),
88
+ "optional": True,
89
+ },
90
+ {
91
+ "name": "locationPreference",
92
+ "type": "dict",
93
+ "fields": [
94
+ {"name": "followGaeApplication", "allow_empty": False, "optional": True},
95
+ {"name": "zone", "allow_empty": False, "optional": True},
96
96
  ],
97
- optional=True,
98
- ),
99
- dict(
100
- name="maintenanceWindow",
101
- type="dict",
102
- fields=[
103
- dict(name="hour", optional=True),
104
- dict(name="day", optional=True),
105
- dict(name="updateTrack", allow_empty=False, optional=True),
97
+ "optional": True,
98
+ },
99
+ {
100
+ "name": "maintenanceWindow",
101
+ "type": "dict",
102
+ "fields": [
103
+ {"name": "hour", "optional": True},
104
+ {"name": "day", "optional": True},
105
+ {"name": "updateTrack", "allow_empty": False, "optional": True},
106
106
  ],
107
- optional=True,
108
- ),
109
- dict(name="pricingPlan", allow_empty=False, optional=True),
110
- dict(name="replicationType", allow_empty=False, optional=True),
111
- dict(name="storageAutoResize", optional=True),
112
- dict(name="storageAutoResizeLimit", optional=True),
113
- dict(name="userLabels", type="dict", optional=True),
107
+ "optional": True,
108
+ },
109
+ {"name": "pricingPlan", "allow_empty": False, "optional": True},
110
+ {"name": "replicationType", "allow_empty": False, "optional": True},
111
+ {"name": "storageAutoResize", "optional": True},
112
+ {"name": "storageAutoResizeLimit", "optional": True},
113
+ {"name": "userLabels", "type": "dict", "optional": True},
114
114
  ],
115
- ),
116
- dict(name="databaseVersion", allow_empty=False, optional=True),
117
- dict(name="failoverReplica", type="dict", fields=[dict(name="name", allow_empty=False)], optional=True),
118
- dict(name="masterInstanceName", allow_empty=False, optional=True),
119
- dict(name="onPremisesConfiguration", type="dict", optional=True),
120
- dict(name="region", allow_empty=False, optional=True),
121
- dict(
122
- name="replicaConfiguration",
123
- type="dict",
124
- fields=[
125
- dict(name="failoverTarget", optional=True),
126
- dict(
127
- name="mysqlReplicaConfiguration",
128
- type="dict",
129
- fields=[
130
- dict(name="caCertificate", allow_empty=False, optional=True),
131
- dict(name="clientCertificate", allow_empty=False, optional=True),
132
- dict(name="clientKey", allow_empty=False, optional=True),
133
- dict(name="connectRetryInterval", optional=True),
134
- dict(name="dumpFilePath", allow_empty=False, optional=True),
135
- dict(name="masterHeartbeatPeriod", optional=True),
136
- dict(name="password", allow_empty=False, optional=True),
137
- dict(name="sslCipher", allow_empty=False, optional=True),
138
- dict(name="username", allow_empty=False, optional=True),
139
- dict(name="verifyServerCertificate", optional=True),
115
+ },
116
+ {"name": "databaseVersion", "allow_empty": False, "optional": True},
117
+ {
118
+ "name": "failoverReplica",
119
+ "type": "dict",
120
+ "fields": [{"name": "name", "allow_empty": False}],
121
+ "optional": True,
122
+ },
123
+ {"name": "masterInstanceName", "allow_empty": False, "optional": True},
124
+ {"name": "onPremisesConfiguration", "type": "dict", "optional": True},
125
+ {"name": "region", "allow_empty": False, "optional": True},
126
+ {
127
+ "name": "replicaConfiguration",
128
+ "type": "dict",
129
+ "fields": [
130
+ {"name": "failoverTarget", "optional": True},
131
+ {
132
+ "name": "mysqlReplicaConfiguration",
133
+ "type": "dict",
134
+ "fields": [
135
+ {"name": "caCertificate", "allow_empty": False, "optional": True},
136
+ {"name": "clientCertificate", "allow_empty": False, "optional": True},
137
+ {"name": "clientKey", "allow_empty": False, "optional": True},
138
+ {"name": "connectRetryInterval", "optional": True},
139
+ {"name": "dumpFilePath", "allow_empty": False, "optional": True},
140
+ {"name": "masterHeartbeatPeriod", "optional": True},
141
+ {"name": "password", "allow_empty": False, "optional": True},
142
+ {"name": "sslCipher", "allow_empty": False, "optional": True},
143
+ {"name": "username", "allow_empty": False, "optional": True},
144
+ {"name": "verifyServerCertificate", "optional": True},
140
145
  ],
141
- optional=True,
142
- ),
146
+ "optional": True,
147
+ },
143
148
  ],
144
- optional=True,
145
- ),
149
+ "optional": True,
150
+ },
146
151
  ]
147
152
  CLOUD_SQL_EXPORT_VALIDATION = [
148
- dict(
149
- name="exportContext",
150
- type="dict",
151
- fields=[
152
- dict(name="fileType", allow_empty=False),
153
- dict(name="uri", allow_empty=False),
154
- dict(name="databases", optional=True, type="list"),
155
- dict(
156
- name="sqlExportOptions",
157
- type="dict",
158
- optional=True,
159
- fields=[
160
- dict(name="tables", optional=True, type="list"),
161
- dict(name="schemaOnly", optional=True),
162
- dict(
163
- name="mysqlExportOptions",
164
- type="dict",
165
- optional=True,
166
- fields=[dict(name="masterData")],
167
- ),
153
+ {
154
+ "name": "exportContext",
155
+ "type": "dict",
156
+ "fields": [
157
+ {"name": "fileType", "allow_empty": False},
158
+ {"name": "uri", "allow_empty": False},
159
+ {"name": "databases", "optional": True, "type": "list"},
160
+ {
161
+ "name": "sqlExportOptions",
162
+ "type": "dict",
163
+ "optional": True,
164
+ "fields": [
165
+ {"name": "tables", "optional": True, "type": "list"},
166
+ {"name": "schemaOnly", "optional": True},
167
+ {
168
+ "name": "mysqlExportOptions",
169
+ "type": "dict",
170
+ "optional": True,
171
+ "fields": [{"name": "masterData"}],
172
+ },
168
173
  ],
169
- ),
170
- dict(
171
- name="csvExportOptions",
172
- type="dict",
173
- optional=True,
174
- fields=[
175
- dict(name="selectQuery"),
176
- dict(name="escapeCharacter", optional=True),
177
- dict(name="quoteCharacter", optional=True),
178
- dict(name="fieldsTerminatedBy", optional=True),
179
- dict(name="linesTerminatedBy", optional=True),
174
+ },
175
+ {
176
+ "name": "csvExportOptions",
177
+ "type": "dict",
178
+ "optional": True,
179
+ "fields": [
180
+ {"name": "selectQuery"},
181
+ {"name": "escapeCharacter", "optional": True},
182
+ {"name": "quoteCharacter", "optional": True},
183
+ {"name": "fieldsTerminatedBy", "optional": True},
184
+ {"name": "linesTerminatedBy", "optional": True},
180
185
  ],
181
- ),
182
- dict(name="offload", optional=True),
186
+ },
187
+ {"name": "offload", "optional": True},
183
188
  ],
184
- )
189
+ }
185
190
  ]
186
191
  CLOUD_SQL_IMPORT_VALIDATION = [
187
- dict(
188
- name="importContext",
189
- type="dict",
190
- fields=[
191
- dict(name="fileType", allow_empty=False),
192
- dict(name="uri", allow_empty=False),
193
- dict(name="database", optional=True, allow_empty=False),
194
- dict(name="importUser", optional=True),
195
- dict(
196
- name="csvImportOptions",
197
- type="dict",
198
- optional=True,
199
- fields=[dict(name="table"), dict(name="columns", type="list", optional=True)],
200
- ),
192
+ {
193
+ "name": "importContext",
194
+ "type": "dict",
195
+ "fields": [
196
+ {"name": "fileType", "allow_empty": False},
197
+ {"name": "uri", "allow_empty": False},
198
+ {"name": "database", "optional": True, "allow_empty": False},
199
+ {"name": "importUser", "optional": True},
200
+ {
201
+ "name": "csvImportOptions",
202
+ "type": "dict",
203
+ "optional": True,
204
+ "fields": [{"name": "table"}, {"name": "columns", "type": "list", "optional": True}],
205
+ },
201
206
  ],
202
- )
207
+ }
203
208
  ]
204
209
  CLOUD_SQL_DATABASE_CREATE_VALIDATION = [
205
- dict(name="instance", allow_empty=False),
206
- dict(name="name", allow_empty=False),
207
- dict(name="project", allow_empty=False),
210
+ {"name": "instance", "allow_empty": False},
211
+ {"name": "name", "allow_empty": False},
212
+ {"name": "project", "allow_empty": False},
208
213
  ]
209
214
  CLOUD_SQL_DATABASE_PATCH_VALIDATION = [
210
- dict(name="instance", optional=True),
211
- dict(name="name", optional=True),
212
- dict(name="project", optional=True),
213
- dict(name="etag", optional=True),
214
- dict(name="charset", optional=True),
215
- dict(name="collation", optional=True),
215
+ {"name": "instance", "optional": True},
216
+ {"name": "name", "optional": True},
217
+ {"name": "project", "optional": True},
218
+ {"name": "etag", "optional": True},
219
+ {"name": "charset", "optional": True},
220
+ {"name": "collation", "optional": True},
216
221
  ]
217
222
 
218
223
 
@@ -22,7 +22,6 @@ from copy import deepcopy
22
22
  from typing import TYPE_CHECKING, Any, Sequence
23
23
 
24
24
  from google.api_core import exceptions
25
- from google.api_core.retry import Retry
26
25
  from google.cloud.compute_v1.types import Instance, InstanceGroupManager, InstanceTemplate
27
26
  from json_merge_patch import merge
28
27
 
@@ -38,6 +37,8 @@ from airflow.providers.google.cloud.utils.field_sanitizer import GcpBodyFieldSan
38
37
  from airflow.providers.google.cloud.utils.field_validator import GcpBodyFieldValidator
39
38
 
40
39
  if TYPE_CHECKING:
40
+ from google.api_core.retry import Retry
41
+
41
42
  from airflow.utils.context import Context
42
43
 
43
44
 
@@ -173,14 +174,13 @@ class ComputeEngineInsertInstanceOperator(ComputeEngineBaseOperator):
173
174
  def check_body_fields(self) -> None:
174
175
  required_params = ["machine_type", "disks", "network_interfaces"]
175
176
  for param in required_params:
176
- if param in self.body:
177
- continue
178
- readable_param = param.replace("_", " ")
179
- raise AirflowException(
180
- f"The body '{self.body}' should contain at least {readable_param} for the new operator "
181
- f"in the '{param}' field. Check (google.cloud.compute_v1.types.Instance) "
182
- f"for more details about body fields description."
183
- )
177
+ if param not in self.body:
178
+ readable_param = param.replace("_", " ")
179
+ raise AirflowException(
180
+ f"The body '{self.body}' should contain at least {readable_param} for the new operator "
181
+ f"in the '{param}' field. Check (google.cloud.compute_v1.types.Instance) "
182
+ f"for more details about body fields description."
183
+ )
184
184
 
185
185
  def _validate_inputs(self) -> None:
186
186
  super()._validate_inputs()
@@ -661,7 +661,7 @@ class ComputeEngineStopInstanceOperator(ComputeEngineBaseOperator):
661
661
 
662
662
 
663
663
  SET_MACHINE_TYPE_VALIDATION_SPECIFICATION = [
664
- dict(name="machineType", regexp="^.+$"),
664
+ {"name": "machineType", "regexp": "^.+$"},
665
665
  ]
666
666
 
667
667
 
@@ -768,44 +768,44 @@ class ComputeEngineSetMachineTypeOperator(ComputeEngineBaseOperator):
768
768
 
769
769
 
770
770
  GCE_INSTANCE_TEMPLATE_VALIDATION_PATCH_SPECIFICATION: list[dict[str, Any]] = [
771
- dict(name="name", regexp="^.+$"),
772
- dict(name="description", optional=True),
773
- dict(
774
- name="properties",
775
- type="dict",
776
- optional=True,
777
- fields=[
778
- dict(name="description", optional=True),
779
- dict(name="tags", optional=True, fields=[dict(name="items", optional=True)]),
780
- dict(name="machineType", optional=True),
781
- dict(name="canIpForward", optional=True),
782
- dict(name="networkInterfaces", optional=True), # not validating deeper
783
- dict(name="disks", optional=True), # not validating the array deeper
784
- dict(
785
- name="metadata",
786
- optional=True,
787
- fields=[
788
- dict(name="fingerprint", optional=True),
789
- dict(name="items", optional=True),
790
- dict(name="kind", optional=True),
771
+ {"name": "name", "regexp": "^.+$"},
772
+ {"name": "description", "optional": True},
773
+ {
774
+ "name": "properties",
775
+ "type": "dict",
776
+ "optional": True,
777
+ "fields": [
778
+ {"name": "description", "optional": True},
779
+ {"name": "tags", "optional": True, "fields": [{"name": "items", "optional": True}]},
780
+ {"name": "machineType", "optional": True},
781
+ {"name": "canIpForward", "optional": True},
782
+ {"name": "networkInterfaces", "optional": True}, # not validating deeper
783
+ {"name": "disks", "optional": True}, # not validating the array deeper
784
+ {
785
+ "name": "metadata",
786
+ "optional": True,
787
+ "fields": [
788
+ {"name": "fingerprint", "optional": True},
789
+ {"name": "items", "optional": True},
790
+ {"name": "kind", "optional": True},
791
791
  ],
792
- ),
793
- dict(name="serviceAccounts", optional=True), # not validating deeper
794
- dict(
795
- name="scheduling",
796
- optional=True,
797
- fields=[
798
- dict(name="onHostMaintenance", optional=True),
799
- dict(name="automaticRestart", optional=True),
800
- dict(name="preemptible", optional=True),
801
- dict(name="nodeAffinities", optional=True), # not validating deeper
792
+ },
793
+ {"name": "serviceAccounts", "optional": True}, # not validating deeper
794
+ {
795
+ "name": "scheduling",
796
+ "optional": True,
797
+ "fields": [
798
+ {"name": "onHostMaintenance", "optional": True},
799
+ {"name": "automaticRestart", "optional": True},
800
+ {"name": "preemptible", "optional": True},
801
+ {"name": "nodeAffinities", "optional": True}, # not validating deeper
802
802
  ],
803
- ),
804
- dict(name="labels", optional=True),
805
- dict(name="guestAccelerators", optional=True), # not validating deeper
806
- dict(name="minCpuPlatform", optional=True),
803
+ },
804
+ {"name": "labels", "optional": True},
805
+ {"name": "guestAccelerators", "optional": True}, # not validating deeper
806
+ {"name": "minCpuPlatform", "optional": True},
807
807
  ],
808
- ),
808
+ },
809
809
  ]
810
810
 
811
811
  GCE_INSTANCE_FIELDS_TO_SANITIZE = [
@@ -914,14 +914,13 @@ class ComputeEngineInsertInstanceTemplateOperator(ComputeEngineBaseOperator):
914
914
  def check_body_fields(self) -> None:
915
915
  required_params = ["machine_type", "disks", "network_interfaces"]
916
916
  for param in required_params:
917
- if param in self.body["properties"]:
918
- continue
919
- readable_param = param.replace("_", " ")
920
- raise AirflowException(
921
- f"The body '{self.body}' should contain at least {readable_param} for the new operator "
922
- f"in the '{param}' field. Check (google.cloud.compute_v1.types.Instance) "
923
- f"for more details about body fields description."
924
- )
917
+ if param not in self.body["properties"]:
918
+ readable_param = param.replace("_", " ")
919
+ raise AirflowException(
920
+ f"The body '{self.body}' should contain at least {readable_param} for the new operator "
921
+ f"in the '{param}' field. Check (google.cloud.compute_v1.types.Instance) "
922
+ f"for more details about body fields description."
923
+ )
925
924
 
926
925
  def _validate_all_body_fields(self) -> None:
927
926
  if self._field_validator:
@@ -1499,14 +1498,13 @@ class ComputeEngineInsertInstanceGroupManagerOperator(ComputeEngineBaseOperator)
1499
1498
  def check_body_fields(self) -> None:
1500
1499
  required_params = ["base_instance_name", "target_size", "instance_template"]
1501
1500
  for param in required_params:
1502
- if param in self.body:
1503
- continue
1504
- readable_param = param.replace("_", " ")
1505
- raise AirflowException(
1506
- f"The body '{self.body}' should contain at least {readable_param} for the new operator "
1507
- f"in the '{param}' field. Check (google.cloud.compute_v1.types.Instance) "
1508
- f"for more details about body fields description."
1509
- )
1501
+ if param not in self.body:
1502
+ readable_param = param.replace("_", " ")
1503
+ raise AirflowException(
1504
+ f"The body '{self.body}' should contain at least {readable_param} for the new operator "
1505
+ f"in the '{param}' field. Check (google.cloud.compute_v1.types.Instance) "
1506
+ f"for more details about body fields description."
1507
+ )
1510
1508
 
1511
1509
  def _validate_all_body_fields(self) -> None:
1512
1510
  if self._field_validator:
@@ -20,7 +20,6 @@ from typing import TYPE_CHECKING, Sequence
20
20
 
21
21
  from google.api_core.exceptions import AlreadyExists, NotFound
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.datacatalog import (
25
24
  DataCatalogClient,
26
25
  Entry,
@@ -31,7 +30,6 @@ 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.providers.google.cloud.hooks.datacatalog import CloudDataCatalogHook
37
35
  from airflow.providers.google.cloud.links.datacatalog import (
@@ -42,6 +40,9 @@ from airflow.providers.google.cloud.links.datacatalog import (
42
40
  from airflow.providers.google.cloud.operators.cloud_base import GoogleCloudBaseOperator
43
41
 
44
42
  if TYPE_CHECKING:
43
+ from google.api_core.retry import Retry
44
+ from google.protobuf.field_mask_pb2 import FieldMask
45
+
45
46
  from airflow.utils.context import Context
46
47
 
47
48
 
@@ -1188,7 +1188,9 @@ class DataflowCreatePythonJobOperator(GoogleCloudBaseOperator):
1188
1188
  pipeline_options.update(self.options)
1189
1189
 
1190
1190
  # Convert argument names from lowerCamelCase to snake case.
1191
- camel_to_snake = lambda name: re.sub(r"[A-Z]", lambda x: "_" + x.group(0).lower(), name)
1191
+ def camel_to_snake(name):
1192
+ return re.sub("[A-Z]", lambda x: "_" + x.group(0).lower(), name)
1193
+
1192
1194
  formatted_pipeline_options = {camel_to_snake(key): pipeline_options[key] for key in pipeline_options}
1193
1195
 
1194
1196
  def set_current_job_id(job_id):
@@ -25,10 +25,11 @@ from airflow.providers.google.cloud.links.dataform import (
25
25
  )
26
26
 
27
27
  if TYPE_CHECKING:
28
+ from google.api_core.retry import Retry
29
+
28
30
  from airflow.utils.context import Context
29
31
 
30
32
  from google.api_core.gapic_v1.method import DEFAULT, _MethodDefault
31
- from google.api_core.retry import Retry
32
33
  from google.cloud.dataform_v1beta1.types import (
33
34
  CompilationResult,
34
35
  InstallNpmPackagesResponse,
@@ -783,7 +783,7 @@ class CloudDataFusionStartPipelineOperator(GoogleCloudBaseOperator):
783
783
  if success_states:
784
784
  self.success_states = success_states
785
785
  else:
786
- self.success_states = SUCCESS_STATES + [PipelineStates.RUNNING]
786
+ self.success_states = [*SUCCESS_STATES, PipelineStates.RUNNING]
787
787
 
788
788
  def execute(self, context: Context) -> str:
789
789
  hook = DataFusionHook(