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.
- 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.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/METADATA +6 -6
- {apache_airflow_providers_google-10.7.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/RECORD +155 -173
- {apache_airflow_providers_google-10.7.0.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.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/LICENSE +0 -0
- {apache_airflow_providers_google-10.7.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/NOTICE +0 -0
- {apache_airflow_providers_google-10.7.0.dist-info → apache_airflow_providers_google-10.8.0.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
48
|
-
|
49
|
-
name
|
50
|
-
type
|
51
|
-
fields
|
52
|
-
|
53
|
-
|
54
|
-
name
|
55
|
-
type
|
56
|
-
fields
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
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
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
name
|
72
|
-
type
|
73
|
-
fields
|
74
|
-
|
75
|
-
name
|
76
|
-
type
|
77
|
-
fields
|
78
|
-
|
79
|
-
|
80
|
-
|
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
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
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
|
89
|
-
|
90
|
-
|
91
|
-
name
|
92
|
-
type
|
93
|
-
fields
|
94
|
-
|
95
|
-
|
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
|
98
|
-
|
99
|
-
|
100
|
-
name
|
101
|
-
type
|
102
|
-
fields
|
103
|
-
|
104
|
-
|
105
|
-
|
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
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
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
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
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
|
142
|
-
|
146
|
+
"optional": True,
|
147
|
+
},
|
143
148
|
],
|
144
|
-
optional
|
145
|
-
|
149
|
+
"optional": True,
|
150
|
+
},
|
146
151
|
]
|
147
152
|
CLOUD_SQL_EXPORT_VALIDATION = [
|
148
|
-
|
149
|
-
name
|
150
|
-
type
|
151
|
-
fields
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
name
|
157
|
-
type
|
158
|
-
optional
|
159
|
-
fields
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
name
|
164
|
-
type
|
165
|
-
optional
|
166
|
-
fields
|
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
|
-
|
171
|
-
name
|
172
|
-
type
|
173
|
-
optional
|
174
|
-
fields
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
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
|
-
|
186
|
+
},
|
187
|
+
{"name": "offload", "optional": True},
|
183
188
|
],
|
184
|
-
|
189
|
+
}
|
185
190
|
]
|
186
191
|
CLOUD_SQL_IMPORT_VALIDATION = [
|
187
|
-
|
188
|
-
name
|
189
|
-
type
|
190
|
-
fields
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
name
|
197
|
-
type
|
198
|
-
optional
|
199
|
-
fields
|
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
|
-
|
206
|
-
|
207
|
-
|
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
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
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
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
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
|
-
|
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
|
-
|
772
|
-
|
773
|
-
|
774
|
-
name
|
775
|
-
type
|
776
|
-
optional
|
777
|
-
fields
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
name
|
786
|
-
optional
|
787
|
-
fields
|
788
|
-
|
789
|
-
|
790
|
-
|
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
|
-
|
794
|
-
|
795
|
-
name
|
796
|
-
optional
|
797
|
-
fields
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
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
|
-
|
805
|
-
|
806
|
-
|
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
|
-
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
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
|
-
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
1507
|
-
|
1508
|
-
|
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
|
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
|
786
|
+
self.success_states = [*SUCCESS_STATES, PipelineStates.RUNNING]
|
787
787
|
|
788
788
|
def execute(self, context: Context) -> str:
|
789
789
|
hook = DataFusionHook(
|