apache-airflow-providers-databricks 7.7.1rc1__tar.gz → 7.7.2rc1__tar.gz
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.
Potentially problematic release.
This version of apache-airflow-providers-databricks might be problematic. Click here for more details.
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/PKG-INFO +9 -10
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/README.rst +4 -6
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/changelog.rst +32 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/index.rst +5 -8
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/task.rst +1 -1
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/workflow.rst +5 -5
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/provider.yaml +2 -1
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/pyproject.toml +7 -5
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/__init__.py +1 -1
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/hooks/databricks.py +10 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/hooks/databricks_sql.py +2 -4
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/operators/databricks.py +0 -4
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/plugins/databricks_workflow.py +25 -18
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/test_databricks.py +42 -1
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/test_databricks_sql.py +15 -18
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/test_databricks.py +0 -36
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/test_databricks_workflow.py +0 -1
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/plugins/test_databricks_workflow.py +5 -5
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/sensors/test_databricks.py +2 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/.latest-doc-only-change.txt +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/commits.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/conf.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/connections/databricks.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/img/databricks_workflow_task_group_airflow_graph_view.png +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/img/workflow_plugin_launch_task.png +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/img/workflow_plugin_single_task.png +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/img/workflow_run_databricks_graph_view.png +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/installing-providers-from-sources.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/integration-logos/Databricks.png +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/copy_into.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/index.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/jobs_create.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/notebook.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/repos_create.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/repos_delete.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/repos_update.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/run_now.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/sql.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/sql_statements.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/operators/submit_run.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/plugins/index.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/plugins/workflow.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/docs/security.rst +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/LICENSE +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/exceptions.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/get_provider_info.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/hooks/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/hooks/databricks_base.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/operators/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/operators/databricks_repos.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/operators/databricks_sql.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/operators/databricks_workflow.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/plugins/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/sensors/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/sensors/databricks.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/sensors/databricks_partition.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/sensors/databricks_sql.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/triggers/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/triggers/databricks.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/utils/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/utils/databricks.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/utils/mixins.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/utils/openlineage.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/src/airflow/providers/databricks/version_compat.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/conftest.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/example_databricks.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/example_databricks_repos.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/example_databricks_sensors.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/example_databricks_sql.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/system/databricks/example_databricks_workflow.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/test_databricks_azure_workload_identity.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/test_databricks_azure_workload_identity_async.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/hooks/test_databricks_base.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/test_databricks_copy.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/test_databricks_repos.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/operators/test_databricks_sql.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/plugins/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/sensors/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/sensors/test_databricks_partition.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/sensors/test_databricks_sql.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/test_exceptions.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/triggers/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/triggers/test_databricks.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/utils/__init__.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/utils/test_databricks.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/utils/test_mixins.py +0 -0
- {apache_airflow_providers_databricks-7.7.1rc1 → apache_airflow_providers_databricks-7.7.2rc1}/tests/unit/databricks/utils/test_openlineage.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apache-airflow-providers-databricks
|
|
3
|
-
Version: 7.7.
|
|
3
|
+
Version: 7.7.2rc1
|
|
4
4
|
Summary: Provider package apache-airflow-providers-databricks for Apache Airflow
|
|
5
5
|
Keywords: airflow-provider,databricks,airflow,integration
|
|
6
6
|
Author-email: Apache Software Foundation <dev@airflow.apache.org>
|
|
@@ -23,7 +23,6 @@ Classifier: Topic :: System :: Monitoring
|
|
|
23
23
|
Requires-Dist: apache-airflow>=2.10.0rc1
|
|
24
24
|
Requires-Dist: apache-airflow-providers-common-compat>=1.6.0rc1
|
|
25
25
|
Requires-Dist: apache-airflow-providers-common-sql>=1.27.0rc1
|
|
26
|
-
Requires-Dist: apache-airflow-providers-openlineage>=2.3.0rc1
|
|
27
26
|
Requires-Dist: requests>=2.32.0,<3
|
|
28
27
|
Requires-Dist: databricks-sql-connector>=4.0.0
|
|
29
28
|
Requires-Dist: databricks-sqlalchemy>=1.0.2
|
|
@@ -35,17 +34,19 @@ Requires-Dist: pyarrow>=16.1.0; python_version < '3.13'
|
|
|
35
34
|
Requires-Dist: pyarrow>=18.0.0; python_version >= '3.13'
|
|
36
35
|
Requires-Dist: azure-identity>=1.3.1 ; extra == "azure-identity"
|
|
37
36
|
Requires-Dist: apache-airflow-providers-fab>=2.2.0rc1 ; extra == "fab" and ( python_version < '3.13')
|
|
37
|
+
Requires-Dist: apache-airflow-providers-openlineage>=2.3.0rc1 ; extra == "openlineage"
|
|
38
38
|
Requires-Dist: databricks-sdk==0.10.0 ; extra == "sdk"
|
|
39
39
|
Requires-Dist: apache-airflow-providers-standard ; extra == "standard"
|
|
40
40
|
Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
|
|
41
|
-
Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.
|
|
42
|
-
Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.
|
|
41
|
+
Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.2/changelog.html
|
|
42
|
+
Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.2
|
|
43
43
|
Project-URL: Mastodon, https://fosstodon.org/@airflow
|
|
44
44
|
Project-URL: Slack Chat, https://s.apache.org/airflow-slack
|
|
45
45
|
Project-URL: Source Code, https://github.com/apache/airflow
|
|
46
46
|
Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
|
|
47
47
|
Provides-Extra: azure-identity
|
|
48
48
|
Provides-Extra: fab
|
|
49
|
+
Provides-Extra: openlineage
|
|
49
50
|
Provides-Extra: sdk
|
|
50
51
|
Provides-Extra: standard
|
|
51
52
|
|
|
@@ -74,9 +75,8 @@ Provides-Extra: standard
|
|
|
74
75
|
|
|
75
76
|
Package ``apache-airflow-providers-databricks``
|
|
76
77
|
|
|
77
|
-
Release: ``7.7.
|
|
78
|
+
Release: ``7.7.2``
|
|
78
79
|
|
|
79
|
-
Release Date: ``|PypiReleaseDate|``
|
|
80
80
|
|
|
81
81
|
`Databricks <https://databricks.com/>`__
|
|
82
82
|
|
|
@@ -88,12 +88,12 @@ This is a provider package for ``databricks`` provider. All classes for this pro
|
|
|
88
88
|
are in ``airflow.providers.databricks`` python package.
|
|
89
89
|
|
|
90
90
|
You can find package information and changelog for the provider
|
|
91
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.
|
|
91
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.2/>`_.
|
|
92
92
|
|
|
93
93
|
Installation
|
|
94
94
|
------------
|
|
95
95
|
|
|
96
|
-
You can install this package on top of an existing Airflow
|
|
96
|
+
You can install this package on top of an existing Airflow installation (see ``Requirements`` below
|
|
97
97
|
for the minimum Airflow version supported) via
|
|
98
98
|
``pip install apache-airflow-providers-databricks``
|
|
99
99
|
|
|
@@ -108,7 +108,6 @@ PIP package Version required
|
|
|
108
108
|
``apache-airflow`` ``>=2.10.0``
|
|
109
109
|
``apache-airflow-providers-common-compat`` ``>=1.6.0``
|
|
110
110
|
``apache-airflow-providers-common-sql`` ``>=1.27.0``
|
|
111
|
-
``apache-airflow-providers-openlineage`` ``>=2.3.0``
|
|
112
111
|
``requests`` ``>=2.32.0,<3``
|
|
113
112
|
``databricks-sql-connector`` ``>=4.0.0``
|
|
114
113
|
``databricks-sqlalchemy`` ``>=1.0.2``
|
|
@@ -143,5 +142,5 @@ Dependent package
|
|
|
143
142
|
================================================================================================================== =================
|
|
144
143
|
|
|
145
144
|
The changelog for the provider package can be found in the
|
|
146
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.
|
|
145
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.2/changelog.html>`_.
|
|
147
146
|
|
|
@@ -23,9 +23,8 @@
|
|
|
23
23
|
|
|
24
24
|
Package ``apache-airflow-providers-databricks``
|
|
25
25
|
|
|
26
|
-
Release: ``7.7.
|
|
26
|
+
Release: ``7.7.2``
|
|
27
27
|
|
|
28
|
-
Release Date: ``|PypiReleaseDate|``
|
|
29
28
|
|
|
30
29
|
`Databricks <https://databricks.com/>`__
|
|
31
30
|
|
|
@@ -37,12 +36,12 @@ This is a provider package for ``databricks`` provider. All classes for this pro
|
|
|
37
36
|
are in ``airflow.providers.databricks`` python package.
|
|
38
37
|
|
|
39
38
|
You can find package information and changelog for the provider
|
|
40
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.
|
|
39
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.2/>`_.
|
|
41
40
|
|
|
42
41
|
Installation
|
|
43
42
|
------------
|
|
44
43
|
|
|
45
|
-
You can install this package on top of an existing Airflow
|
|
44
|
+
You can install this package on top of an existing Airflow installation (see ``Requirements`` below
|
|
46
45
|
for the minimum Airflow version supported) via
|
|
47
46
|
``pip install apache-airflow-providers-databricks``
|
|
48
47
|
|
|
@@ -57,7 +56,6 @@ PIP package Version required
|
|
|
57
56
|
``apache-airflow`` ``>=2.10.0``
|
|
58
57
|
``apache-airflow-providers-common-compat`` ``>=1.6.0``
|
|
59
58
|
``apache-airflow-providers-common-sql`` ``>=1.27.0``
|
|
60
|
-
``apache-airflow-providers-openlineage`` ``>=2.3.0``
|
|
61
59
|
``requests`` ``>=2.32.0,<3``
|
|
62
60
|
``databricks-sql-connector`` ``>=4.0.0``
|
|
63
61
|
``databricks-sqlalchemy`` ``>=1.0.2``
|
|
@@ -92,4 +90,4 @@ Dependent package
|
|
|
92
90
|
================================================================================================================== =================
|
|
93
91
|
|
|
94
92
|
The changelog for the provider package can be found in the
|
|
95
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.
|
|
93
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-databricks/7.7.2/changelog.html>`_.
|
|
@@ -26,6 +26,38 @@
|
|
|
26
26
|
Changelog
|
|
27
27
|
---------
|
|
28
28
|
|
|
29
|
+
7.7.2
|
|
30
|
+
.....
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
Release Date: ``|PypiReleaseDate|``
|
|
34
|
+
|
|
35
|
+
Bug Fixes
|
|
36
|
+
~~~~~~~~~
|
|
37
|
+
|
|
38
|
+
* ``Fix Databricks sqlalchemy URL construction (#54478)``
|
|
39
|
+
* ``Ensures DatabricksWorkflowOperator updates ACL (if available) when resetting a job. (#47827)``
|
|
40
|
+
|
|
41
|
+
Misc
|
|
42
|
+
~~~~
|
|
43
|
+
|
|
44
|
+
* ``Remove airflow.models.DAG (#54383)``
|
|
45
|
+
* ``chore: change openlineage to optional dependency (#54748)``
|
|
46
|
+
* ``Move DagBag to SDK and make it return SDK DAG objects (#53918)``
|
|
47
|
+
|
|
48
|
+
Doc-only
|
|
49
|
+
~~~~~~~~
|
|
50
|
+
|
|
51
|
+
* ``Make term Dag consistent in providers docs (#55101)``
|
|
52
|
+
|
|
53
|
+
.. Below changes are excluded from the changelog. Move them to
|
|
54
|
+
appropriate section above if needed. Do not delete the lines(!):
|
|
55
|
+
* ``Switch pre-commit to prek (#54258)``
|
|
56
|
+
* ``Add CI support for SQLAlchemy 2.0 (#52233)``
|
|
57
|
+
|
|
58
|
+
.. Review and move the new changes to one of the sections above:
|
|
59
|
+
* ``Fix Airflow 2 reference in README/index of providers (#55240)``
|
|
60
|
+
|
|
29
61
|
7.7.1
|
|
30
62
|
.....
|
|
31
63
|
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
:maxdepth: 1
|
|
58
58
|
:caption: Resources
|
|
59
59
|
|
|
60
|
-
Example
|
|
60
|
+
Example Dags <https://github.com/apache/airflow/tree/providers-databricks/|version|/providers/databricks/tests/system/databricks>
|
|
61
61
|
PyPI Repository <https://pypi.org/project/apache-airflow-providers-databricks/>
|
|
62
62
|
Installing from sources <installing-providers-from-sources>
|
|
63
63
|
|
|
@@ -78,9 +78,7 @@ apache-airflow-providers-databricks package
|
|
|
78
78
|
`Databricks <https://databricks.com/>`__
|
|
79
79
|
|
|
80
80
|
|
|
81
|
-
Release: 7.7.
|
|
82
|
-
|
|
83
|
-
Release Date: ``|PypiReleaseDate|``
|
|
81
|
+
Release: 7.7.2
|
|
84
82
|
|
|
85
83
|
Provider package
|
|
86
84
|
----------------
|
|
@@ -91,7 +89,7 @@ All classes for this package are included in the ``airflow.providers.databricks`
|
|
|
91
89
|
Installation
|
|
92
90
|
------------
|
|
93
91
|
|
|
94
|
-
You can install this package on top of an existing Airflow
|
|
92
|
+
You can install this package on top of an existing Airflow installation via
|
|
95
93
|
``pip install apache-airflow-providers-databricks``.
|
|
96
94
|
For the minimum Airflow version supported, see ``Requirements`` below.
|
|
97
95
|
|
|
@@ -106,7 +104,6 @@ PIP package Version required
|
|
|
106
104
|
``apache-airflow`` ``>=2.10.0``
|
|
107
105
|
``apache-airflow-providers-common-compat`` ``>=1.6.0``
|
|
108
106
|
``apache-airflow-providers-common-sql`` ``>=1.27.0``
|
|
109
|
-
``apache-airflow-providers-openlineage`` ``>=2.3.0``
|
|
110
107
|
``requests`` ``>=2.32.0,<3``
|
|
111
108
|
``databricks-sql-connector`` ``>=4.0.0``
|
|
112
109
|
``databricks-sqlalchemy`` ``>=1.0.2``
|
|
@@ -146,5 +143,5 @@ Downloading official packages
|
|
|
146
143
|
You can download officially released packages and verify their checksums and signatures from the
|
|
147
144
|
`Official Apache Download site <https://downloads.apache.org/airflow/providers/>`_
|
|
148
145
|
|
|
149
|
-
* `The apache-airflow-providers-databricks 7.7.
|
|
150
|
-
* `The apache-airflow-providers-databricks 7.7.
|
|
146
|
+
* `The apache-airflow-providers-databricks 7.7.2 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2.tar.gz.sha512>`__)
|
|
147
|
+
* `The apache-airflow-providers-databricks 7.7.2 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_databricks-7.7.2-py3-none-any.whl.sha512>`__)
|
|
@@ -22,7 +22,7 @@ DatabricksTaskOperator
|
|
|
22
22
|
======================
|
|
23
23
|
|
|
24
24
|
Use the :class:`~airflow.providers.databricks.operators.databricks.DatabricksTaskOperator` to launch and monitor
|
|
25
|
-
task runs on Databricks as Airflow tasks. This can be used as a standalone operator in a
|
|
25
|
+
task runs on Databricks as Airflow tasks. This can be used as a standalone operator in a Dag and as well as part of a
|
|
26
26
|
Databricks Workflow by using it as an operator(task) within the
|
|
27
27
|
:class:`~airflow.providers.databricks.operators.databricks_workflow.DatabricksWorkflowTaskGroup`.
|
|
28
28
|
|
|
@@ -28,7 +28,7 @@ Databricks notebook job runs as Airflow tasks. The task group launches a `Databr
|
|
|
28
28
|
There are a few advantages to defining your Databricks Workflows in Airflow:
|
|
29
29
|
|
|
30
30
|
======================================= ============================================= =================================
|
|
31
|
-
Authoring interface via Databricks (Web-based with Databricks UI) via Airflow(Code with Airflow
|
|
31
|
+
Authoring interface via Databricks (Web-based with Databricks UI) via Airflow(Code with Airflow Dag)
|
|
32
32
|
======================================= ============================================= =================================
|
|
33
33
|
Workflow compute pricing ✅ ✅
|
|
34
34
|
Notebook code in source control ✅ ✅
|
|
@@ -36,14 +36,14 @@ Workflow structure in source control ✅
|
|
|
36
36
|
Retry from beginning ✅ ✅
|
|
37
37
|
Retry single task ✅ ✅
|
|
38
38
|
Task groups within Workflows ✅
|
|
39
|
-
Trigger workflows from other
|
|
39
|
+
Trigger workflows from other Dags ✅
|
|
40
40
|
Workflow-level parameters ✅
|
|
41
41
|
======================================= ============================================= =================================
|
|
42
42
|
|
|
43
43
|
Examples
|
|
44
44
|
--------
|
|
45
45
|
|
|
46
|
-
Example of what a
|
|
46
|
+
Example of what a Dag looks like with a DatabricksWorkflowTaskGroup
|
|
47
47
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
48
48
|
.. exampleinclude:: /../../databricks/tests/system/databricks/example_databricks_workflow.py
|
|
49
49
|
:language: python
|
|
@@ -53,13 +53,13 @@ Example of what a DAG looks like with a DatabricksWorkflowTaskGroup
|
|
|
53
53
|
With this example, Airflow will produce a job named ``<dag_name>.test_workflow_<USER>_<GROUP_ID>`` that will
|
|
54
54
|
run task ``notebook_1`` and then ``notebook_2``. The job will be created in the databricks workspace
|
|
55
55
|
if it does not already exist. If the job already exists, it will be updated to match
|
|
56
|
-
the workflow defined in the
|
|
56
|
+
the workflow defined in the Dag.
|
|
57
57
|
|
|
58
58
|
The following image displays the resulting Databricks Workflow in the Airflow UI (based on the above example provided)
|
|
59
59
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
60
60
|
.. image:: ../img/databricks_workflow_task_group_airflow_graph_view.png
|
|
61
61
|
|
|
62
|
-
The corresponding Databricks Workflow in the Databricks UI for the run triggered from the Airflow
|
|
62
|
+
The corresponding Databricks Workflow in the Databricks UI for the run triggered from the Airflow Dag is depicted below
|
|
63
63
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
64
64
|
|
|
65
65
|
.. image:: ../img/workflow_run_databricks_graph_view.png
|
|
@@ -22,12 +22,13 @@ description: |
|
|
|
22
22
|
`Databricks <https://databricks.com/>`__
|
|
23
23
|
|
|
24
24
|
state: ready
|
|
25
|
-
source-date-epoch:
|
|
25
|
+
source-date-epoch: 1756876778
|
|
26
26
|
# Note that those versions are maintained by release manager - do not update them manually
|
|
27
27
|
# with the exception of case where other provider in sources has >= new provider version.
|
|
28
28
|
# In such case adding >= NEW_VERSION and bumping to NEW_VERSION in a provider have
|
|
29
29
|
# to be done in the same PR
|
|
30
30
|
versions:
|
|
31
|
+
- 7.7.2
|
|
31
32
|
- 7.7.1
|
|
32
33
|
- 7.7.0
|
|
33
34
|
- 7.6.0
|
|
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
|
|
|
25
25
|
|
|
26
26
|
[project]
|
|
27
27
|
name = "apache-airflow-providers-databricks"
|
|
28
|
-
version = "7.7.
|
|
28
|
+
version = "7.7.2rc1"
|
|
29
29
|
description = "Provider package apache-airflow-providers-databricks for Apache Airflow"
|
|
30
30
|
readme = "README.rst"
|
|
31
31
|
authors = [
|
|
@@ -54,13 +54,12 @@ requires-python = ">=3.10"
|
|
|
54
54
|
|
|
55
55
|
# The dependencies should be modified in place in the generated file.
|
|
56
56
|
# Any change in the dependencies is preserved when the file is regenerated
|
|
57
|
-
# Make sure to run ``
|
|
57
|
+
# Make sure to run ``prek update-providers-dependencies --all-files``
|
|
58
58
|
# After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
|
|
59
59
|
dependencies = [
|
|
60
60
|
"apache-airflow>=2.10.0rc1",
|
|
61
61
|
"apache-airflow-providers-common-compat>=1.6.0rc1",
|
|
62
62
|
"apache-airflow-providers-common-sql>=1.27.0rc1",
|
|
63
|
-
"apache-airflow-providers-openlineage>=2.3.0rc1",
|
|
64
63
|
"requests>=2.32.0,<3",
|
|
65
64
|
"databricks-sql-connector>=4.0.0",
|
|
66
65
|
"databricks-sqlalchemy>=1.0.2",
|
|
@@ -88,6 +87,9 @@ dependencies = [
|
|
|
88
87
|
"standard" = [
|
|
89
88
|
"apache-airflow-providers-standard"
|
|
90
89
|
]
|
|
90
|
+
"openlineage" = [
|
|
91
|
+
"apache-airflow-providers-openlineage>=2.3.0rc1"
|
|
92
|
+
]
|
|
91
93
|
|
|
92
94
|
[dependency-groups]
|
|
93
95
|
dev = [
|
|
@@ -131,8 +133,8 @@ apache-airflow-providers-common-sql = {workspace = true}
|
|
|
131
133
|
apache-airflow-providers-standard = {workspace = true}
|
|
132
134
|
|
|
133
135
|
[project.urls]
|
|
134
|
-
"Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.
|
|
135
|
-
"Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.
|
|
136
|
+
"Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.2"
|
|
137
|
+
"Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-databricks/7.7.2/changelog.html"
|
|
136
138
|
"Bug Tracker" = "https://github.com/apache/airflow/issues"
|
|
137
139
|
"Source Code" = "https://github.com/apache/airflow"
|
|
138
140
|
"Slack Chat" = "https://s.apache.org/airflow-slack"
|
|
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
|
|
|
29
29
|
|
|
30
30
|
__all__ = ["__version__"]
|
|
31
31
|
|
|
32
|
-
__version__ = "7.7.
|
|
32
|
+
__version__ = "7.7.2"
|
|
33
33
|
|
|
34
34
|
if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
|
|
35
35
|
"2.10.0"
|
|
@@ -298,6 +298,16 @@ class DatabricksHook(BaseDatabricksHook):
|
|
|
298
298
|
|
|
299
299
|
:param json: The data used in the new_settings of the request to the ``reset`` endpoint.
|
|
300
300
|
"""
|
|
301
|
+
access_control_list = json.get("access_control_list", None)
|
|
302
|
+
if access_control_list:
|
|
303
|
+
self.log.info(
|
|
304
|
+
"Updating job permission for Databricks workflow job id %s with access_control_list %s",
|
|
305
|
+
job_id,
|
|
306
|
+
access_control_list,
|
|
307
|
+
)
|
|
308
|
+
acl_json = {"access_control_list": access_control_list}
|
|
309
|
+
self.update_job_permission(job_id=int(job_id), json=acl_json)
|
|
310
|
+
|
|
301
311
|
self._do_api_call(RESET_ENDPOINT, {"job_id": job_id, "new_settings": json})
|
|
302
312
|
|
|
303
313
|
def update_job(self, job_id: str, json: dict) -> None:
|
|
@@ -179,7 +179,6 @@ class DatabricksSqlHook(BaseDatabricksHook, DbApiHook):
|
|
|
179
179
|
|
|
180
180
|
:return: the extracted sqlalchemy.engine.URL object.
|
|
181
181
|
"""
|
|
182
|
-
conn = self.get_conn()
|
|
183
182
|
url_query = {
|
|
184
183
|
"http_path": self._http_path,
|
|
185
184
|
"catalog": self.catalog,
|
|
@@ -189,9 +188,8 @@ class DatabricksSqlHook(BaseDatabricksHook, DbApiHook):
|
|
|
189
188
|
return URL.create(
|
|
190
189
|
drivername="databricks",
|
|
191
190
|
username="token",
|
|
192
|
-
password=
|
|
193
|
-
host=
|
|
194
|
-
port=conn.port,
|
|
191
|
+
password=self._get_token(raise_error=True),
|
|
192
|
+
host=self.host,
|
|
195
193
|
query=url_query,
|
|
196
194
|
)
|
|
197
195
|
|
|
@@ -398,10 +398,6 @@ class DatabricksCreateJobsOperator(BaseOperator):
|
|
|
398
398
|
if job_id is None:
|
|
399
399
|
return self._hook.create_job(self.json)
|
|
400
400
|
self._hook.reset_job(str(job_id), self.json)
|
|
401
|
-
if (access_control_list := self.json.get("access_control_list")) is not None:
|
|
402
|
-
acl_json = {"access_control_list": access_control_list}
|
|
403
|
-
self._hook.update_job_permission(job_id, normalise_json_content(acl_json))
|
|
404
|
-
|
|
405
401
|
return job_id
|
|
406
402
|
|
|
407
403
|
|
|
@@ -27,10 +27,8 @@ from flask_appbuilder import BaseView
|
|
|
27
27
|
from flask_appbuilder.api import expose
|
|
28
28
|
|
|
29
29
|
from airflow.exceptions import AirflowException, TaskInstanceNotFound
|
|
30
|
-
from airflow.models import DagBag
|
|
31
|
-
from airflow.models.dag import DAG, clear_task_instances
|
|
32
30
|
from airflow.models.dagrun import DagRun
|
|
33
|
-
from airflow.models.taskinstance import TaskInstance, TaskInstanceKey
|
|
31
|
+
from airflow.models.taskinstance import TaskInstance, TaskInstanceKey, clear_task_instances
|
|
34
32
|
from airflow.plugins_manager import AirflowPlugin
|
|
35
33
|
from airflow.providers.databricks.hooks.databricks import DatabricksHook
|
|
36
34
|
from airflow.providers.databricks.version_compat import AIRFLOW_V_3_0_PLUS, BaseOperatorLink, TaskGroup, XCom
|
|
@@ -90,8 +88,15 @@ def get_databricks_task_ids(
|
|
|
90
88
|
if not AIRFLOW_V_3_0_PLUS:
|
|
91
89
|
from airflow.utils.session import NEW_SESSION, provide_session
|
|
92
90
|
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
def _get_dag(dag_id: str, session: Session):
|
|
92
|
+
from airflow.models.serialized_dag import SerializedDagModel
|
|
93
|
+
|
|
94
|
+
dag = SerializedDagModel.get_dag(dag_id, session=session)
|
|
95
|
+
if not dag:
|
|
96
|
+
raise AirflowException("Dag not found.")
|
|
97
|
+
return dag
|
|
98
|
+
|
|
99
|
+
def _get_dagrun(dag, run_id: str, session: Session) -> DagRun:
|
|
95
100
|
"""
|
|
96
101
|
Retrieve the DagRun object associated with the specified DAG and run_id.
|
|
97
102
|
|
|
@@ -107,10 +112,9 @@ if not AIRFLOW_V_3_0_PLUS:
|
|
|
107
112
|
|
|
108
113
|
@provide_session
|
|
109
114
|
def _clear_task_instances(
|
|
110
|
-
dag_id: str, run_id: str, task_ids: list[str], log: logging.Logger, session: Session
|
|
115
|
+
dag_id: str, run_id: str, task_ids: list[str], log: logging.Logger, session: Session = NEW_SESSION
|
|
111
116
|
) -> None:
|
|
112
|
-
|
|
113
|
-
dag = dag_bag.get_dag(dag_id)
|
|
117
|
+
dag = _get_dag(dag_id, session=session)
|
|
114
118
|
log.debug("task_ids %s to clear", str(task_ids))
|
|
115
119
|
dr: DagRun = _get_dagrun(dag, run_id, session=session)
|
|
116
120
|
tis_to_clear = [ti for ti in dr.get_task_instances() if ti.databricks_task_key in task_ids]
|
|
@@ -274,13 +278,8 @@ class WorkflowJobRunLink(BaseOperatorLink, LoggingMixin):
|
|
|
274
278
|
ti = get_task_instance(operator, dttm)
|
|
275
279
|
ti_key = ti.key
|
|
276
280
|
task_group = operator.task_group
|
|
277
|
-
|
|
278
281
|
if not task_group:
|
|
279
282
|
raise AirflowException("Task group is required for generating Databricks Workflow Job Run Link.")
|
|
280
|
-
|
|
281
|
-
dag_bag = DagBag(read_dags_from_db=True)
|
|
282
|
-
dag = dag_bag.get_dag(ti_key.dag_id)
|
|
283
|
-
dag.get_task(ti_key.task_id)
|
|
284
283
|
self.log.info("Getting link for task %s", ti_key.task_id)
|
|
285
284
|
if ".launch" not in ti_key.task_id:
|
|
286
285
|
self.log.debug("Finding the launch task for job run metadata %s", ti_key.task_id)
|
|
@@ -375,9 +374,12 @@ class WorkflowJobRepairAllFailedLink(BaseOperatorLink, LoggingMixin):
|
|
|
375
374
|
raise AirflowException("Task group is required for generating repair link.")
|
|
376
375
|
if not task_group.group_id:
|
|
377
376
|
raise AirflowException("Task group ID is required for generating repair link.")
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
377
|
+
|
|
378
|
+
from airflow.utils.session import create_session
|
|
379
|
+
|
|
380
|
+
with create_session() as session:
|
|
381
|
+
dag = _get_dag(ti_key.dag_id, session=session)
|
|
382
|
+
dr = _get_dagrun(dag, ti_key.run_id, session=session)
|
|
381
383
|
log.debug("Getting failed and skipped tasks for dag run %s", dr.run_id)
|
|
382
384
|
task_group_sub_tasks = self.get_task_group_children(task_group).items()
|
|
383
385
|
failed_and_skipped_tasks = self._get_failed_and_skipped_tasks(dr)
|
|
@@ -435,9 +437,14 @@ class WorkflowJobRepairSingleTaskLink(BaseOperatorLink, LoggingMixin):
|
|
|
435
437
|
task_group.group_id,
|
|
436
438
|
ti_key.task_id,
|
|
437
439
|
)
|
|
438
|
-
|
|
439
|
-
|
|
440
|
+
|
|
441
|
+
from airflow.utils.session import create_session
|
|
442
|
+
|
|
443
|
+
with create_session() as session:
|
|
444
|
+
dag = _get_dag(ti_key.dag_id, session=session)
|
|
440
445
|
task = dag.get_task(ti_key.task_id)
|
|
446
|
+
if TYPE_CHECKING:
|
|
447
|
+
assert isinstance(task, DatabricksTaskBaseOperator)
|
|
441
448
|
|
|
442
449
|
if ".launch" not in ti_key.task_id:
|
|
443
450
|
launch_task_id = get_launch_task_id(task_group)
|
|
@@ -275,6 +275,13 @@ def list_spark_versions_endpoint(host):
|
|
|
275
275
|
return f"https://{host}/api/2.0/clusters/spark-versions"
|
|
276
276
|
|
|
277
277
|
|
|
278
|
+
def permissions_endpoint(host, job_id):
|
|
279
|
+
"""
|
|
280
|
+
Utility function to generate the permissions endpoint given the host
|
|
281
|
+
"""
|
|
282
|
+
return f"https://{host}/api/2.0/permissions/jobs/{job_id}"
|
|
283
|
+
|
|
284
|
+
|
|
278
285
|
def create_valid_response_mock(content):
|
|
279
286
|
response = mock.MagicMock()
|
|
280
287
|
response.json.return_value = content
|
|
@@ -474,7 +481,7 @@ class TestDatabricksHook:
|
|
|
474
481
|
)
|
|
475
482
|
|
|
476
483
|
@mock.patch("airflow.providers.databricks.hooks.databricks_base.requests")
|
|
477
|
-
def
|
|
484
|
+
def test_reset_with_no_acl(self, mock_requests):
|
|
478
485
|
mock_requests.codes.ok = 200
|
|
479
486
|
status_code_mock = mock.PropertyMock(return_value=200)
|
|
480
487
|
type(mock_requests.post.return_value).status_code = status_code_mock
|
|
@@ -490,6 +497,40 @@ class TestDatabricksHook:
|
|
|
490
497
|
timeout=self.hook.timeout_seconds,
|
|
491
498
|
)
|
|
492
499
|
|
|
500
|
+
@mock.patch("airflow.providers.databricks.hooks.databricks_base.requests")
|
|
501
|
+
def test_reset_with_acl(self, mock_requests):
|
|
502
|
+
mock_requests.codes.ok = 200
|
|
503
|
+
status_code_mock = mock.PropertyMock(return_value=200)
|
|
504
|
+
type(mock_requests.post.return_value).status_code = status_code_mock
|
|
505
|
+
ACCESS_CONTROL_LIST = [{"permission_level": "CAN_MANAGE", "user_name": "test_user"}]
|
|
506
|
+
json = {
|
|
507
|
+
"access_control_list": ACCESS_CONTROL_LIST,
|
|
508
|
+
"name": "test",
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
self.hook.reset_job(JOB_ID, json)
|
|
512
|
+
|
|
513
|
+
mock_requests.post.assert_called_once_with(
|
|
514
|
+
reset_endpoint(HOST),
|
|
515
|
+
json={
|
|
516
|
+
"job_id": JOB_ID,
|
|
517
|
+
"new_settings": json,
|
|
518
|
+
},
|
|
519
|
+
params=None,
|
|
520
|
+
auth=HTTPBasicAuth(LOGIN, PASSWORD),
|
|
521
|
+
headers=self.hook.user_agent_header,
|
|
522
|
+
timeout=self.hook.timeout_seconds,
|
|
523
|
+
)
|
|
524
|
+
|
|
525
|
+
mock_requests.patch.assert_called_once_with(
|
|
526
|
+
permissions_endpoint(HOST, JOB_ID),
|
|
527
|
+
json={"access_control_list": ACCESS_CONTROL_LIST},
|
|
528
|
+
params=None,
|
|
529
|
+
auth=HTTPBasicAuth(LOGIN, PASSWORD),
|
|
530
|
+
headers=self.hook.user_agent_header,
|
|
531
|
+
timeout=self.hook.timeout_seconds,
|
|
532
|
+
)
|
|
533
|
+
|
|
493
534
|
@mock.patch("airflow.providers.databricks.hooks.databricks_base.requests")
|
|
494
535
|
def test_update(self, mock_requests):
|
|
495
536
|
mock_requests.codes.ok = 200
|
|
@@ -39,7 +39,6 @@ TASK_ID = "databricks-sql-operator"
|
|
|
39
39
|
DEFAULT_CONN_ID = "databricks_default"
|
|
40
40
|
HOST = "xx.cloud.databricks.com"
|
|
41
41
|
HOST_WITH_SCHEME = "https://xx.cloud.databricks.com"
|
|
42
|
-
PORT = 443
|
|
43
42
|
TOKEN = "token"
|
|
44
43
|
HTTP_PATH = "sql/protocolv1/o/1234567890123456/0123-456789-abcd123"
|
|
45
44
|
SCHEMA = "test_schema"
|
|
@@ -112,38 +111,36 @@ def mock_timer():
|
|
|
112
111
|
yield mock_timer
|
|
113
112
|
|
|
114
113
|
|
|
115
|
-
def
|
|
116
|
-
return Connection(
|
|
117
|
-
conn_id=DEFAULT_CONN_ID,
|
|
118
|
-
conn_type="databricks",
|
|
119
|
-
host=HOST,
|
|
120
|
-
port=PORT,
|
|
121
|
-
login="token",
|
|
122
|
-
password=TOKEN,
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def test_sqlachemy_url_property(mock_get_conn):
|
|
127
|
-
mock_get_conn.return_value = make_mock_connection()
|
|
114
|
+
def test_sqlachemy_url_property():
|
|
128
115
|
hook = DatabricksSqlHook(
|
|
129
116
|
databricks_conn_id=DEFAULT_CONN_ID, http_path=HTTP_PATH, catalog=CATALOG, schema=SCHEMA
|
|
130
117
|
)
|
|
131
118
|
url = hook.sqlalchemy_url.render_as_string(hide_password=False)
|
|
132
119
|
expected_url = (
|
|
133
|
-
f"databricks://token:{TOKEN}@{HOST}
|
|
120
|
+
f"databricks://token:{TOKEN}@{HOST}?"
|
|
134
121
|
f"catalog={CATALOG}&http_path={quote_plus(HTTP_PATH)}&schema={SCHEMA}"
|
|
135
122
|
)
|
|
136
123
|
assert url == expected_url
|
|
137
124
|
|
|
138
125
|
|
|
139
|
-
def
|
|
140
|
-
|
|
126
|
+
def test_get_sqlalchemy_engine():
|
|
127
|
+
hook = DatabricksSqlHook(
|
|
128
|
+
databricks_conn_id=DEFAULT_CONN_ID, http_path=HTTP_PATH, catalog=CATALOG, schema=SCHEMA
|
|
129
|
+
)
|
|
130
|
+
engine = hook.get_sqlalchemy_engine()
|
|
131
|
+
assert engine.url.render_as_string(hide_password=False) == (
|
|
132
|
+
f"databricks://token:{TOKEN}@{HOST}?"
|
|
133
|
+
f"catalog={CATALOG}&http_path={quote_plus(HTTP_PATH)}&schema={SCHEMA}"
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def test_get_uri():
|
|
141
138
|
hook = DatabricksSqlHook(
|
|
142
139
|
databricks_conn_id=DEFAULT_CONN_ID, http_path=HTTP_PATH, catalog=CATALOG, schema=SCHEMA
|
|
143
140
|
)
|
|
144
141
|
uri = hook.get_uri()
|
|
145
142
|
expected_uri = (
|
|
146
|
-
f"databricks://token:{TOKEN}@{HOST}
|
|
143
|
+
f"databricks://token:{TOKEN}@{HOST}?"
|
|
147
144
|
f"catalog={CATALOG}&http_path={quote_plus(HTTP_PATH)}&schema={SCHEMA}"
|
|
148
145
|
)
|
|
149
146
|
assert uri == expected_uri
|
|
@@ -569,42 +569,6 @@ class TestDatabricksCreateJobsOperator:
|
|
|
569
569
|
db_mock.reset_job.assert_called_once_with(JOB_ID, expected)
|
|
570
570
|
assert return_result == JOB_ID
|
|
571
571
|
|
|
572
|
-
@mock.patch("airflow.providers.databricks.operators.databricks.DatabricksHook")
|
|
573
|
-
def test_exec_update_job_permission(self, db_mock_class):
|
|
574
|
-
"""
|
|
575
|
-
Test job permission update.
|
|
576
|
-
"""
|
|
577
|
-
json = {
|
|
578
|
-
"name": JOB_NAME,
|
|
579
|
-
"tags": TAGS,
|
|
580
|
-
"tasks": TASKS,
|
|
581
|
-
"job_clusters": JOB_CLUSTERS,
|
|
582
|
-
"email_notifications": EMAIL_NOTIFICATIONS,
|
|
583
|
-
"webhook_notifications": WEBHOOK_NOTIFICATIONS,
|
|
584
|
-
"timeout_seconds": TIMEOUT_SECONDS,
|
|
585
|
-
"schedule": SCHEDULE,
|
|
586
|
-
"max_concurrent_runs": MAX_CONCURRENT_RUNS,
|
|
587
|
-
"git_source": GIT_SOURCE,
|
|
588
|
-
"access_control_list": ACCESS_CONTROL_LIST,
|
|
589
|
-
}
|
|
590
|
-
op = DatabricksCreateJobsOperator(task_id=TASK_ID, json=json)
|
|
591
|
-
db_mock = db_mock_class.return_value
|
|
592
|
-
db_mock.find_job_id_by_name.return_value = JOB_ID
|
|
593
|
-
|
|
594
|
-
op.execute({})
|
|
595
|
-
|
|
596
|
-
expected = utils.normalise_json_content({"access_control_list": ACCESS_CONTROL_LIST})
|
|
597
|
-
|
|
598
|
-
db_mock_class.assert_called_once_with(
|
|
599
|
-
DEFAULT_CONN_ID,
|
|
600
|
-
retry_limit=op.databricks_retry_limit,
|
|
601
|
-
retry_delay=op.databricks_retry_delay,
|
|
602
|
-
retry_args=None,
|
|
603
|
-
caller="DatabricksCreateJobsOperator",
|
|
604
|
-
)
|
|
605
|
-
|
|
606
|
-
db_mock.update_job_permission.assert_called_once_with(JOB_ID, expected)
|
|
607
|
-
|
|
608
572
|
@mock.patch("airflow.providers.databricks.operators.databricks.DatabricksHook")
|
|
609
573
|
def test_exec_update_job_permission_with_empty_acl(self, db_mock_class):
|
|
610
574
|
"""
|
|
@@ -104,7 +104,6 @@ def test_create_or_reset_job_existing(mock_databricks_hook, context, mock_task_g
|
|
|
104
104
|
operator = _CreateDatabricksWorkflowOperator(task_id="test_task", databricks_conn_id="databricks_default")
|
|
105
105
|
operator.task_group = mock_task_group
|
|
106
106
|
operator._hook.list_jobs.return_value = [{"job_id": 123}]
|
|
107
|
-
operator._hook.create_job.return_value = 123
|
|
108
107
|
|
|
109
108
|
job_id = operator._create_or_reset_job(context)
|
|
110
109
|
assert job_id == 123
|
|
@@ -217,7 +217,7 @@ def test_workflow_job_run_link_airflow2():
|
|
|
217
217
|
"airflow.providers.databricks.plugins.databricks_workflow.get_xcom_result"
|
|
218
218
|
) as mock_get_xcom_result:
|
|
219
219
|
with patch(
|
|
220
|
-
"airflow.providers.databricks.plugins.databricks_workflow.
|
|
220
|
+
"airflow.providers.databricks.plugins.databricks_workflow._get_dag"
|
|
221
221
|
) as mock_get_dag:
|
|
222
222
|
mock_connection = Mock()
|
|
223
223
|
mock_connection.extra_dejson = {"host": "mockhost"}
|
|
@@ -448,15 +448,15 @@ class TestDatabricksWorkflowPluginAirflow2:
|
|
|
448
448
|
with patch(
|
|
449
449
|
"airflow.providers.databricks.plugins.databricks_workflow.get_xcom_result"
|
|
450
450
|
) as mock_get_xcom:
|
|
451
|
-
with patch(
|
|
451
|
+
with patch(
|
|
452
|
+
"airflow.providers.databricks.plugins.databricks_workflow._get_dag"
|
|
453
|
+
) as mock_get_dag:
|
|
452
454
|
with patch(
|
|
453
455
|
"airflow.providers.databricks.plugins.databricks_workflow.DatabricksHook"
|
|
454
456
|
) as mock_hook:
|
|
455
457
|
mock_get_ti.return_value = Mock(key=ti_key)
|
|
456
458
|
mock_get_xcom.return_value = Mock(conn_id="conn_id", run_id=1, job_id=1)
|
|
457
|
-
|
|
458
|
-
task_id="test_task"
|
|
459
|
-
)
|
|
459
|
+
mock_get_dag.return_value.get_task.return_value = Mock(task_id="test_task")
|
|
460
460
|
|
|
461
461
|
mock_hook_instance = Mock()
|
|
462
462
|
mock_hook_instance.host = "test-host"
|
|
@@ -21,6 +21,8 @@ from unittest import mock
|
|
|
21
21
|
|
|
22
22
|
import pytest
|
|
23
23
|
|
|
24
|
+
pytest.importorskip("flask_appbuilder") # Remove after upgrading to FAB5
|
|
25
|
+
|
|
24
26
|
from airflow.exceptions import AirflowException, TaskDeferred
|
|
25
27
|
from airflow.providers.databricks.hooks.databricks import SQLStatementState
|
|
26
28
|
from airflow.providers.databricks.sensors.databricks import DatabricksSQLStatementsSensor
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|