apache-airflow-providers-yandex 4.1.1rc1__tar.gz → 4.2.0rc1__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.
Files changed (65) hide show
  1. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/PKG-INFO +15 -33
  2. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/README.rst +9 -27
  3. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/changelog.rst +24 -0
  4. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/index.rst +8 -34
  5. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/provider.yaml +5 -1
  6. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/pyproject.toml +6 -6
  7. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/__init__.py +1 -1
  8. {apache_airflow_providers_yandex-4.1.1rc1/tests/system → apache_airflow_providers_yandex-4.2.0rc1/src/airflow/providers}/__init__.py +1 -1
  9. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/__init__.py +1 -1
  10. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/hooks/yandex.py +1 -5
  11. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/operators/dataproc.py +16 -4
  12. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/version_compat.py +9 -0
  13. {apache_airflow_providers_yandex-4.1.1rc1/tests/unit → apache_airflow_providers_yandex-4.2.0rc1/tests/system}/__init__.py +1 -1
  14. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/system/yandex/example_yandexcloud.py +6 -1
  15. {apache_airflow_providers_yandex-4.1.1rc1/src/airflow/providers → apache_airflow_providers_yandex-4.2.0rc1/tests/unit}/__init__.py +1 -1
  16. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/hooks/test_dataproc.py +4 -3
  17. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/hooks/test_yandex.py +2 -1
  18. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/hooks/test_yq.py +2 -1
  19. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/links/test_yq.py +9 -3
  20. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/operators/test_dataproc.py +70 -2
  21. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/operators/test_yq.py +3 -2
  22. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/secrets/test_lockbox.py +3 -2
  23. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/.latest-doc-only-change.txt +0 -0
  24. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/commits.rst +0 -0
  25. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/conf.py +0 -0
  26. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/configurations-ref.rst +0 -0
  27. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/connections/yandexcloud.rst +0 -0
  28. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/installing-providers-from-sources.rst +0 -0
  29. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/integration-logos/Yandex-Cloud.png +0 -0
  30. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/operators/dataproc.rst +0 -0
  31. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/operators/index.rst +0 -0
  32. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/operators/yq.rst +0 -0
  33. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/secrets-backends/yandex-cloud-lockbox-secret-backend.rst +0 -0
  34. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/docs/security.rst +0 -0
  35. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/LICENSE +0 -0
  36. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/get_provider_info.py +0 -0
  37. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/hooks/__init__.py +0 -0
  38. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/hooks/dataproc.py +0 -0
  39. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/hooks/yq.py +0 -0
  40. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/links/__init__.py +0 -0
  41. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/links/yq.py +0 -0
  42. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/operators/__init__.py +0 -0
  43. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/operators/yq.py +0 -0
  44. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/secrets/__init__.py +0 -0
  45. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/secrets/lockbox.py +0 -0
  46. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/utils/__init__.py +0 -0
  47. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/utils/credentials.py +0 -0
  48. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/utils/defaults.py +0 -0
  49. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/utils/fields.py +0 -0
  50. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/src/airflow/providers/yandex/utils/user_agent.py +0 -0
  51. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/conftest.py +0 -0
  52. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/system/yandex/__init__.py +0 -0
  53. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/system/yandex/example_yandexcloud_dataproc.py +0 -0
  54. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/system/yandex/example_yandexcloud_dataproc_lightweight.py +0 -0
  55. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/system/yandex/example_yandexcloud_yq.py +0 -0
  56. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/__init__.py +0 -0
  57. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/hooks/__init__.py +0 -0
  58. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/links/__init__.py +0 -0
  59. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/operators/__init__.py +0 -0
  60. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/secrets/__init__.py +0 -0
  61. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/utils/__init__.py +0 -0
  62. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/utils/test_credentials.py +0 -0
  63. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/utils/test_defaults.py +0 -0
  64. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/utils/test_fields.py +0 -0
  65. {apache_airflow_providers_yandex-4.1.1rc1 → apache_airflow_providers_yandex-4.2.0rc1}/tests/unit/yandex/utils/test_user_agent.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-yandex
3
- Version: 4.1.1rc1
3
+ Version: 4.2.0rc1
4
4
  Summary: Provider package apache-airflow-providers-yandex for Apache Airflow
5
5
  Keywords: airflow-provider,yandex,airflow,integration
6
6
  Author-email: Apache Software Foundation <dev@airflow.apache.org>
7
7
  Maintainer-email: Apache Software Foundation <dev@airflow.apache.org>
8
- Requires-Python: ~=3.10
8
+ Requires-Python: >=3.10,!=3.13
9
9
  Description-Content-Type: text/x-rst
10
10
  Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Environment :: Console
@@ -20,12 +20,12 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Topic :: System :: Monitoring
22
22
  Requires-Dist: apache-airflow>=2.10.0rc1
23
- Requires-Dist: yandexcloud>=0.308.0
24
- Requires-Dist: yandex-query-client>=0.1.4
23
+ Requires-Dist: yandexcloud>=0.308.0; python_version < '3.13'
24
+ Requires-Dist: yandex-query-client>=0.1.4; python_version < '3.13'
25
25
  Requires-Dist: apache-airflow-providers-common-compat ; extra == "common-compat"
26
26
  Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
27
- Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-yandex/4.1.1/changelog.html
28
- Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-yandex/4.1.1
27
+ Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-yandex/4.2.0/changelog.html
28
+ Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-yandex/4.2.0
29
29
  Project-URL: Mastodon, https://fosstodon.org/@airflow
30
30
  Project-URL: Slack Chat, https://s.apache.org/airflow-slack
31
31
  Project-URL: Source Code, https://github.com/apache/airflow
@@ -57,8 +57,9 @@ Provides-Extra: common-compat
57
57
 
58
58
  Package ``apache-airflow-providers-yandex``
59
59
 
60
- Release: ``4.1.1``
60
+ Release: ``4.2.0``
61
61
 
62
+ Release Date: ``|PypiReleaseDate|``
62
63
 
63
64
  This package is for Yandex, including:
64
65
 
@@ -72,7 +73,7 @@ This is a provider package for ``yandex`` provider. All classes for this provide
72
73
  are in ``airflow.providers.yandex`` python package.
73
74
 
74
75
  You can find package information and changelog for the provider
75
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-yandex/4.1.1/>`_.
76
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-yandex/4.2.0/>`_.
76
77
 
77
78
  Installation
78
79
  ------------
@@ -86,33 +87,14 @@ The package supports the following python versions: 3.10,3.11,3.12
86
87
  Requirements
87
88
  ------------
88
89
 
89
- ======================= ==================
90
+ ======================= ======================================
90
91
  PIP package Version required
91
- ======================= ==================
92
+ ======================= ======================================
92
93
  ``apache-airflow`` ``>=2.10.0``
93
- ``yandexcloud`` ``>=0.308.0``
94
- ``yandex-query-client`` ``>=0.1.4``
95
- ======================= ==================
96
-
97
- Cross provider package dependencies
98
- -----------------------------------
99
-
100
- Those are dependencies that might be needed in order to use all the features of the package.
101
- You need to install the specified providers in order to use them.
102
-
103
- You can install such cross-provider dependencies when installing from PyPI. For example:
104
-
105
- .. code-block:: bash
106
-
107
- pip install apache-airflow-providers-yandex[common.compat]
108
-
109
-
110
- ================================================================================================================== =================
111
- Dependent package Extra
112
- ================================================================================================================== =================
113
- `apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
114
- ================================================================================================================== =================
94
+ ``yandexcloud`` ``>=0.308.0; python_version < "3.13"``
95
+ ``yandex-query-client`` ``>=0.1.4; python_version < "3.13"``
96
+ ======================= ======================================
115
97
 
116
98
  The changelog for the provider package can be found in the
117
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-yandex/4.1.1/changelog.html>`_.
99
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-yandex/4.2.0/changelog.html>`_.
118
100
 
@@ -23,8 +23,9 @@
23
23
 
24
24
  Package ``apache-airflow-providers-yandex``
25
25
 
26
- Release: ``4.1.1``
26
+ Release: ``4.2.0``
27
27
 
28
+ Release Date: ``|PypiReleaseDate|``
28
29
 
29
30
  This package is for Yandex, including:
30
31
 
@@ -38,7 +39,7 @@ This is a provider package for ``yandex`` provider. All classes for this provide
38
39
  are in ``airflow.providers.yandex`` python package.
39
40
 
40
41
  You can find package information and changelog for the provider
41
- in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-yandex/4.1.1/>`_.
42
+ in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-yandex/4.2.0/>`_.
42
43
 
43
44
  Installation
44
45
  ------------
@@ -52,32 +53,13 @@ The package supports the following python versions: 3.10,3.11,3.12
52
53
  Requirements
53
54
  ------------
54
55
 
55
- ======================= ==================
56
+ ======================= ======================================
56
57
  PIP package Version required
57
- ======================= ==================
58
+ ======================= ======================================
58
59
  ``apache-airflow`` ``>=2.10.0``
59
- ``yandexcloud`` ``>=0.308.0``
60
- ``yandex-query-client`` ``>=0.1.4``
61
- ======================= ==================
62
-
63
- Cross provider package dependencies
64
- -----------------------------------
65
-
66
- Those are dependencies that might be needed in order to use all the features of the package.
67
- You need to install the specified providers in order to use them.
68
-
69
- You can install such cross-provider dependencies when installing from PyPI. For example:
70
-
71
- .. code-block:: bash
72
-
73
- pip install apache-airflow-providers-yandex[common.compat]
74
-
75
-
76
- ================================================================================================================== =================
77
- Dependent package Extra
78
- ================================================================================================================== =================
79
- `apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
80
- ================================================================================================================== =================
60
+ ``yandexcloud`` ``>=0.308.0; python_version < "3.13"``
61
+ ``yandex-query-client`` ``>=0.1.4; python_version < "3.13"``
62
+ ======================= ======================================
81
63
 
82
64
  The changelog for the provider package can be found in the
83
- `changelog <https://airflow.apache.org/docs/apache-airflow-providers-yandex/4.1.1/changelog.html>`_.
65
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-yandex/4.2.0/changelog.html>`_.
@@ -27,6 +27,30 @@
27
27
  Changelog
28
28
  ---------
29
29
 
30
+ 4.2.0
31
+ .....
32
+
33
+ Features
34
+ ~~~~~~~~
35
+
36
+ * ``Add environment and oslogin for yandex dataproc create cluster (#52973)``
37
+
38
+ Misc
39
+ ~~~~
40
+
41
+ * ``Fix unreachable code errors in yandex provider (#53453)``
42
+ * ``Add Python 3.13 support for Airflow. (#46891)``
43
+ * ``Remove type ignore across codebase after mypy upgrade (#53243)``
44
+ * ``Remove upper-binding for "python-requires" (#52980)``
45
+ * ``Temporarily switch to use >=,< pattern instead of '~=' (#52967)``
46
+ * ``Moving BaseHook usages to version_compat for yandex (#52963)``
47
+
48
+ .. Below changes are excluded from the changelog. Move them to
49
+ appropriate section above if needed. Do not delete the lines(!):
50
+ * ``Deprecate decorators from Core (#53629)``
51
+ * ``Cleanup type ignores in yandex provider where possible (#53251)``
52
+ * ``Make dag_version_id in TI non-nullable (#50825)``
53
+
30
54
  4.1.1
31
55
  .....
32
56
 
@@ -81,7 +81,9 @@ This package is for Yandex, including:
81
81
  - `Yandex.Cloud <https://cloud.yandex.com/>`__
82
82
 
83
83
 
84
- Release: 4.1.1
84
+ Release: 4.2.0
85
+
86
+ Release Date: ``|PypiReleaseDate|``
85
87
 
86
88
  Provider package
87
89
  ----------------
@@ -101,38 +103,10 @@ Requirements
101
103
 
102
104
  The minimum Apache Airflow version supported by this provider distribution is ``2.10.0``.
103
105
 
104
- ======================= ==================
106
+ ======================= ======================================
105
107
  PIP package Version required
106
- ======================= ==================
108
+ ======================= ======================================
107
109
  ``apache-airflow`` ``>=2.10.0``
108
- ``yandexcloud`` ``>=0.308.0``
109
- ``yandex-query-client`` ``>=0.1.4``
110
- ======================= ==================
111
-
112
- Cross provider package dependencies
113
- -----------------------------------
114
-
115
- Those are dependencies that might be needed in order to use all the features of the package.
116
- You need to install the specified provider distributions in order to use them.
117
-
118
- You can install such cross-provider dependencies when installing from PyPI. For example:
119
-
120
- .. code-block:: bash
121
-
122
- pip install apache-airflow-providers-yandex[common.compat]
123
-
124
-
125
- ================================================================================================================== =================
126
- Dependent package Extra
127
- ================================================================================================================== =================
128
- `apache-airflow-providers-common-compat <https://airflow.apache.org/docs/apache-airflow-providers-common-compat>`_ ``common.compat``
129
- ================================================================================================================== =================
130
-
131
- Downloading official packages
132
- -----------------------------
133
-
134
- You can download officially released packages and verify their checksums and signatures from the
135
- `Official Apache Download site <https://downloads.apache.org/airflow/providers/>`_
136
-
137
- * `The apache-airflow-providers-yandex 4.1.1 sdist package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_yandex-4.1.1.tar.gz>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_yandex-4.1.1.tar.gz.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_yandex-4.1.1.tar.gz.sha512>`__)
138
- * `The apache-airflow-providers-yandex 4.1.1 wheel package <https://downloads.apache.org/airflow/providers/apache_airflow_providers_yandex-4.1.1-py3-none-any.whl>`_ (`asc <https://downloads.apache.org/airflow/providers/apache_airflow_providers_yandex-4.1.1-py3-none-any.whl.asc>`__, `sha512 <https://downloads.apache.org/airflow/providers/apache_airflow_providers_yandex-4.1.1-py3-none-any.whl.sha512>`__)
110
+ ``yandexcloud`` ``>=0.308.0; python_version < "3.13"``
111
+ ``yandex-query-client`` ``>=0.1.4; python_version < "3.13"``
112
+ ======================= ======================================
@@ -23,12 +23,13 @@ description: |
23
23
 
24
24
  - `Yandex.Cloud <https://cloud.yandex.com/>`__
25
25
  state: ready
26
- source-date-epoch: 1751474658
26
+ source-date-epoch: 1753692100
27
27
  # Note that those versions are maintained by release manager - do not update them manually
28
28
  # with the exception of case where other provider in sources has >= new provider version.
29
29
  # In such case adding >= NEW_VERSION and bumping to NEW_VERSION in a provider have
30
30
  # to be done in the same PR
31
31
  versions:
32
+ - 4.2.0
32
33
  - 4.1.1
33
34
  - 4.1.0
34
35
  - 4.0.3
@@ -60,6 +61,9 @@ versions:
60
61
  - 1.0.1
61
62
  - 1.0.0
62
63
 
64
+ excluded-python-versions:
65
+ - "3.13"
66
+
63
67
  integrations:
64
68
  - integration-name: Yandex.Cloud
65
69
  external-doc-url: https://cloud.yandex.com/
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
25
25
 
26
26
  [project]
27
27
  name = "apache-airflow-providers-yandex"
28
- version = "4.1.1rc1"
28
+ version = "4.2.0rc1"
29
29
  description = "Provider package apache-airflow-providers-yandex for Apache Airflow"
30
30
  readme = "README.rst"
31
31
  authors = [
@@ -49,7 +49,7 @@ classifiers = [
49
49
  "Programming Language :: Python :: 3.12",
50
50
  "Topic :: System :: Monitoring",
51
51
  ]
52
- requires-python = "~=3.10"
52
+ requires-python = ">=3.10,!=3.13"
53
53
 
54
54
  # The dependencies should be modified in place in the generated file.
55
55
  # Any change in the dependencies is preserved when the file is regenerated
@@ -57,8 +57,8 @@ requires-python = "~=3.10"
57
57
  # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
58
58
  dependencies = [
59
59
  "apache-airflow>=2.10.0rc1",
60
- "yandexcloud>=0.308.0",
61
- "yandex-query-client>=0.1.4",
60
+ "yandexcloud>=0.308.0; python_version < '3.13'",
61
+ "yandex-query-client>=0.1.4; python_version < '3.13'",
62
62
  ]
63
63
 
64
64
  # The optional dependencies should be modified in place in the generated file
@@ -103,8 +103,8 @@ apache-airflow-providers-common-sql = {workspace = true}
103
103
  apache-airflow-providers-standard = {workspace = true}
104
104
 
105
105
  [project.urls]
106
- "Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-yandex/4.1.1"
107
- "Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-yandex/4.1.1/changelog.html"
106
+ "Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-yandex/4.2.0"
107
+ "Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-yandex/4.2.0/changelog.html"
108
108
  "Bug Tracker" = "https://github.com/apache/airflow/issues"
109
109
  "Source Code" = "https://github.com/apache/airflow"
110
110
  "Slack Chat" = "https://s.apache.org/airflow-slack"
@@ -14,4 +14,4 @@
14
14
  # KIND, either express or implied. See the License for the
15
15
  # specific language governing permissions and limitations
16
16
  # under the License.
17
- __path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore
17
+ __path__ = __import__("pkgutil").extend_path(__path__, __name__)
@@ -14,4 +14,4 @@
14
14
  # KIND, either express or implied. See the License for the
15
15
  # specific language governing permissions and limitations
16
16
  # under the License.
17
- __path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore
17
+ __path__ = __import__("pkgutil").extend_path(__path__, __name__)
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
29
29
 
30
30
  __all__ = ["__version__"]
31
31
 
32
- __version__ = "4.1.1"
32
+ __version__ = "4.2.0"
33
33
 
34
34
  if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
35
35
  "2.10.0"
@@ -28,11 +28,7 @@ from airflow.providers.yandex.utils.credentials import (
28
28
  from airflow.providers.yandex.utils.defaults import conn_name_attr, conn_type, default_conn_name, hook_name
29
29
  from airflow.providers.yandex.utils.fields import get_field_from_extras
30
30
  from airflow.providers.yandex.utils.user_agent import provider_user_agent
31
-
32
- try:
33
- from airflow.sdk import BaseHook
34
- except ImportError:
35
- from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef]
31
+ from airflow.providers.yandex.version_compat import BaseHook
36
32
 
37
33
 
38
34
  class YandexCloudBaseHook(BaseHook):
@@ -14,12 +14,15 @@
14
14
  # KIND, either express or implied. See the License for the
15
15
  # specific language governing permissions and limitations
16
16
  # under the License.
17
+
17
18
  from __future__ import annotations
18
19
 
19
20
  from collections.abc import Iterable, Sequence
20
21
  from dataclasses import dataclass
21
22
  from typing import TYPE_CHECKING
22
23
 
24
+ import yandexcloud
25
+
23
26
  from airflow.providers.yandex.hooks.dataproc import DataprocHook
24
27
  from airflow.providers.yandex.version_compat import BaseOperator
25
28
 
@@ -54,6 +57,7 @@ class DataprocCreateClusterOperator(BaseOperator):
54
57
  Currently there are ru-central1-a, ru-central1-b and ru-central1-c.
55
58
  :param service_account_id: Service account id for the cluster.
56
59
  Service account can be created inside the folder.
60
+ :param environment: Environment for the cluster. Possible options: PRODUCTION, PRESTABLE.
57
61
  :param masternode_resource_preset: Resources preset (CPU+RAM configuration)
58
62
  for the primary node of the cluster.
59
63
  :param masternode_disk_size: Masternode storage size in GiB.
@@ -96,6 +100,7 @@ class DataprocCreateClusterOperator(BaseOperator):
96
100
  Docs: https://cloud.yandex.com/docs/data-proc/concepts/logs
97
101
  :param initialization_actions: Set of init-actions to run when cluster starts.
98
102
  Docs: https://cloud.yandex.com/docs/data-proc/concepts/init-action
103
+ :param oslogin_enabled: Enable authorization via OS Login for cluster.
99
104
  :param labels: Cluster labels as key:value pairs. No more than 64 per resource.
100
105
  Docs: https://cloud.yandex.com/docs/resource-manager/concepts/labels
101
106
  """
@@ -109,10 +114,11 @@ class DataprocCreateClusterOperator(BaseOperator):
109
114
  cluster_image_version: str | None = None,
110
115
  ssh_public_keys: str | Iterable[str] | None = None,
111
116
  subnet_id: str | None = None,
112
- services: Iterable[str] = ("HDFS", "YARN", "MAPREDUCE", "HIVE", "SPARK"),
117
+ services: Iterable[str] | None = ("HDFS", "YARN", "MAPREDUCE", "HIVE", "SPARK"),
113
118
  s3_bucket: str | None = None,
114
119
  zone: str = "ru-central1-b",
115
120
  service_account_id: str | None = None,
121
+ environment: str | None = None,
116
122
  masternode_resource_preset: str | None = None,
117
123
  masternode_disk_size: int | None = None,
118
124
  masternode_disk_type: str | None = None,
@@ -138,6 +144,7 @@ class DataprocCreateClusterOperator(BaseOperator):
138
144
  security_group_ids: Iterable[str] | None = None,
139
145
  log_group_id: str | None = None,
140
146
  initialization_actions: Iterable[InitializationAction] | None = None,
147
+ oslogin_enabled: bool = False,
141
148
  labels: dict[str, str] | None = None,
142
149
  **kwargs,
143
150
  ) -> None:
@@ -145,9 +152,6 @@ class DataprocCreateClusterOperator(BaseOperator):
145
152
  if ssh_public_keys is None:
146
153
  ssh_public_keys = []
147
154
 
148
- if services is None:
149
- services = []
150
-
151
155
  self.folder_id = folder_id
152
156
  self.yandex_conn_id = connection_id
153
157
  self.cluster_name = cluster_name
@@ -159,6 +163,7 @@ class DataprocCreateClusterOperator(BaseOperator):
159
163
  self.s3_bucket = s3_bucket
160
164
  self.zone = zone
161
165
  self.service_account_id = service_account_id
166
+ self.environment = environment
162
167
  self.masternode_resource_preset = masternode_resource_preset
163
168
  self.masternode_disk_size = masternode_disk_size
164
169
  self.masternode_disk_type = masternode_disk_type
@@ -183,6 +188,7 @@ class DataprocCreateClusterOperator(BaseOperator):
183
188
  self.security_group_ids = security_group_ids
184
189
  self.log_group_id = log_group_id
185
190
  self.initialization_actions = initialization_actions
191
+ self.oslogin_enabled = oslogin_enabled
186
192
  self.labels = labels
187
193
 
188
194
  self.hook: DataprocHook | None = None
@@ -191,6 +197,11 @@ class DataprocCreateClusterOperator(BaseOperator):
191
197
  self.hook = DataprocHook(
192
198
  yandex_conn_id=self.yandex_conn_id,
193
199
  )
200
+ kwargs_depends_on_version = {}
201
+ if yandexcloud.__version__ >= "0.350.0":
202
+ kwargs_depends_on_version.update(
203
+ {"oslogin_enabled": self.oslogin_enabled, "environment": self.environment}
204
+ )
194
205
  operation_result = self.hook.dataproc_client.create_cluster(
195
206
  folder_id=self.folder_id,
196
207
  cluster_name=self.cluster_name,
@@ -236,6 +247,7 @@ class DataprocCreateClusterOperator(BaseOperator):
236
247
  ]
237
248
  if self.initialization_actions
238
249
  else None,
250
+ **kwargs_depends_on_version,
239
251
  )
240
252
  cluster_id = operation_result.response.id
241
253
 
@@ -28,6 +28,13 @@ def get_base_airflow_version_tuple() -> tuple[int, int, int]:
28
28
 
29
29
 
30
30
  AIRFLOW_V_3_0_PLUS = get_base_airflow_version_tuple() >= (3, 0, 0)
31
+ AIRFLOW_V_3_1_PLUS: bool = get_base_airflow_version_tuple() >= (3, 1, 0)
32
+
33
+
34
+ if AIRFLOW_V_3_1_PLUS:
35
+ from airflow.sdk import BaseHook
36
+ else:
37
+ from airflow.hooks.base import BaseHook # type: ignore[attr-defined,no-redef]
31
38
 
32
39
  if AIRFLOW_V_3_0_PLUS:
33
40
  from airflow.sdk import BaseOperator, BaseOperatorLink
@@ -41,6 +48,8 @@ else:
41
48
 
42
49
  __all__ = [
43
50
  "AIRFLOW_V_3_0_PLUS",
51
+ "AIRFLOW_V_3_1_PLUS",
52
+ "BaseHook",
44
53
  "BaseOperator",
45
54
  "BaseOperatorLink",
46
55
  "Context",
@@ -14,4 +14,4 @@
14
14
  # KIND, either express or implied. See the License for the
15
15
  # specific language governing permissions and limitations
16
16
  # under the License.
17
- __path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore
17
+ __path__ = __import__("pkgutil").extend_path(__path__, __name__)
@@ -30,7 +30,12 @@ from google.protobuf.json_format import MessageToDict
30
30
  from yandexcloud.operations import OperationError
31
31
 
32
32
  from airflow import DAG
33
- from airflow.decorators import task
33
+
34
+ try:
35
+ from airflow.sdk import task
36
+ except ImportError:
37
+ # Airflow 2 path
38
+ from airflow.decorators import task # type: ignore[attr-defined,no-redef]
34
39
  from airflow.providers.yandex.hooks.yandex import YandexCloudBaseHook
35
40
 
36
41
  from tests_common.test_utils.system_tests import get_test_env_id
@@ -14,4 +14,4 @@
14
14
  # KIND, either express or implied. See the License for the
15
15
  # specific language governing permissions and limitations
16
16
  # under the License.
17
- __path__ = __import__("pkgutil").extend_path(__path__, __name__) # type: ignore
17
+ __path__ = __import__("pkgutil").extend_path(__path__, __name__)
@@ -21,6 +21,8 @@ from unittest import mock
21
21
 
22
22
  import pytest
23
23
 
24
+ pytest.importorskip("yandexcloud")
25
+
24
26
  try:
25
27
  import importlib.util
26
28
 
@@ -30,10 +32,9 @@ try:
30
32
  BASEHOOK_PATCH_PATH = "airflow.sdk.bases.hook.BaseHook"
31
33
  except ImportError:
32
34
  BASEHOOK_PATCH_PATH = "airflow.hooks.base.BaseHook"
33
- yandexlcloud = pytest.importorskip("yandexcloud")
34
35
 
35
- from airflow.models import Connection # noqa: E402
36
- from airflow.providers.yandex.hooks.dataproc import DataprocHook # noqa: E402
36
+ from airflow.models import Connection
37
+ from airflow.providers.yandex.hooks.dataproc import DataprocHook
37
38
 
38
39
  # Airflow connection with type "yandexcloud" must be created
39
40
  CONNECTION_ID = "yandexcloud_default"
@@ -21,6 +21,8 @@ from unittest import mock
21
21
 
22
22
  import pytest
23
23
 
24
+ pytest.importorskip("yandexcloud")
25
+
24
26
  from airflow.providers.yandex.hooks.yandex import YandexCloudBaseHook
25
27
 
26
28
  from tests_common.test_utils.config import conf_vars
@@ -34,7 +36,6 @@ try:
34
36
  BASEHOOK_PATCH_PATH = "airflow.sdk.bases.hook.BaseHook"
35
37
  except ImportError:
36
38
  BASEHOOK_PATCH_PATH = "airflow.hooks.base.BaseHook"
37
- yandexcloud = pytest.importorskip("yandexcloud")
38
39
 
39
40
 
40
41
  class TestYandexHook:
@@ -25,7 +25,6 @@ import responses
25
25
  from responses import matchers
26
26
 
27
27
  from airflow.models import Connection
28
- from airflow.providers.yandex.hooks.yq import YQHook
29
28
 
30
29
  try:
31
30
  import importlib.util
@@ -38,6 +37,8 @@ except ImportError:
38
37
  BASEHOOK_PATCH_PATH = "airflow.hooks.base.BaseHook"
39
38
  yandexcloud = pytest.importorskip("yandexcloud")
40
39
 
40
+ from airflow.providers.yandex.hooks.yq import YQHook
41
+
41
42
  OAUTH_TOKEN = "my_oauth_token"
42
43
  IAM_TOKEN = "my_iam_token"
43
44
  SERVICE_ACCOUNT_AUTH_KEY_JSON = """{"id":"my_id", "service_account_id":"my_sa1", "private_key":"my_pk"}"""
@@ -29,7 +29,7 @@ from tests_common.test_utils.version_compat import AIRFLOW_V_3_0_PLUS
29
29
  if AIRFLOW_V_3_0_PLUS:
30
30
  from airflow.sdk.execution_time.xcom import XCom
31
31
  else:
32
- from airflow.models import XCom # type: ignore[no-redef]
32
+ from airflow.models import XCom
33
33
 
34
34
  yandexcloud = pytest.importorskip("yandexcloud")
35
35
 
@@ -52,7 +52,10 @@ def test_default_link():
52
52
  link = YQLink()
53
53
 
54
54
  op = MockOperator(task_id="test_task_id")
55
- ti = TaskInstance(task=op, run_id="run_id1")
55
+ if AIRFLOW_V_3_0_PLUS:
56
+ ti = TaskInstance(task=op, run_id="run_id1", dag_version_id=mock.MagicMock())
57
+ else:
58
+ ti = TaskInstance(task=op, run_id="run_id1")
56
59
  assert link.get_link(op, ti_key=ti.key) == "https://yq.cloud.yandex.ru"
57
60
 
58
61
 
@@ -62,5 +65,8 @@ def test_link():
62
65
  link = YQLink()
63
66
 
64
67
  op = MockOperator(task_id="test_task_id")
65
- ti = TaskInstance(task=op, run_id="run_id1")
68
+ if AIRFLOW_V_3_0_PLUS:
69
+ ti = TaskInstance(task=op, run_id="run_id1", dag_version_id=mock.MagicMock())
70
+ else:
71
+ ti = TaskInstance(task=op, run_id="run_id1")
66
72
  assert link.get_link(op, ti_key=ti.key) == "https://g.com"
@@ -21,6 +21,8 @@ from unittest.mock import MagicMock, call, patch
21
21
 
22
22
  import pytest
23
23
 
24
+ yandexcloud = pytest.importorskip("yandexcloud")
25
+
24
26
  from airflow.models.dag import DAG
25
27
  from airflow.providers.yandex.operators.dataproc import (
26
28
  DataprocCreateClusterOperator,
@@ -31,8 +33,6 @@ from airflow.providers.yandex.operators.dataproc import (
31
33
  DataprocDeleteClusterOperator,
32
34
  )
33
35
 
34
- yandexcloud = pytest.importorskip("yandexcloud")
35
-
36
36
  # Airflow connection with type "yandexcloud"
37
37
  CONNECTION_ID = "yandexcloud_default"
38
38
 
@@ -93,6 +93,7 @@ class TestDataprocClusterCreateOperator:
93
93
  @patch("airflow.providers.yandex.utils.credentials.get_credentials")
94
94
  @patch(f"{BASEHOOK_PATCH_PATH}.get_connection")
95
95
  @patch("yandexcloud._wrappers.dataproc.Dataproc.create_cluster")
96
+ @patch("yandexcloud.__version__", "0.308.0")
96
97
  def test_create_cluster(self, mock_create_cluster, *_):
97
98
  operator = DataprocCreateClusterOperator(
98
99
  task_id="create_cluster",
@@ -154,6 +155,73 @@ class TestDataprocClusterCreateOperator:
154
155
  ]
155
156
  )
156
157
 
158
+ @patch("airflow.providers.yandex.utils.credentials.get_credentials")
159
+ @patch(f"{BASEHOOK_PATCH_PATH}.get_connection")
160
+ @patch("yandexcloud._wrappers.dataproc.Dataproc.create_cluster")
161
+ @patch("yandexcloud.__version__", "0.350.0")
162
+ def test_create_cluster_with_350_sdk(self, mock_create_cluster, *_):
163
+ operator = DataprocCreateClusterOperator(
164
+ task_id="create_cluster",
165
+ ssh_public_keys=SSH_PUBLIC_KEYS,
166
+ folder_id=FOLDER_ID,
167
+ subnet_id=SUBNET_ID,
168
+ zone=AVAILABILITY_ZONE_ID,
169
+ connection_id=CONNECTION_ID,
170
+ s3_bucket=S3_BUCKET_NAME_FOR_LOGS,
171
+ cluster_image_version=CLUSTER_IMAGE_VERSION,
172
+ log_group_id=LOG_GROUP_ID,
173
+ )
174
+ context = {"task_instance": MagicMock()}
175
+ operator.execute(context)
176
+ mock_create_cluster.assert_called_once_with(
177
+ cluster_description="",
178
+ cluster_image_version="1.4",
179
+ cluster_name=None,
180
+ computenode_count=0,
181
+ computenode_disk_size=None,
182
+ computenode_disk_type=None,
183
+ computenode_resource_preset=None,
184
+ computenode_max_hosts_count=None,
185
+ computenode_measurement_duration=None,
186
+ computenode_warmup_duration=None,
187
+ computenode_stabilization_duration=None,
188
+ computenode_preemptible=False,
189
+ computenode_cpu_utilization_target=None,
190
+ computenode_decommission_timeout=None,
191
+ datanode_count=1,
192
+ datanode_disk_size=None,
193
+ datanode_disk_type=None,
194
+ datanode_resource_preset=None,
195
+ folder_id="my_folder_id",
196
+ masternode_disk_size=None,
197
+ masternode_disk_type=None,
198
+ masternode_resource_preset=None,
199
+ s3_bucket="my_bucket_name",
200
+ service_account_id=None,
201
+ services=("HDFS", "YARN", "MAPREDUCE", "HIVE", "SPARK"),
202
+ ssh_public_keys=[
203
+ "ssh-rsa AAA5B3NzaC1yc2EAA1ADA2ABA3AA4QCxO38tKA0XIs9ivPxt7AYdf3bgtAR1ow3Qkb9GPQ6wkFHQq"
204
+ "cFDe6faKCxH6iDRt2o4D8L8Bx6zN42uZSB0nf8jkIxFTcEU3mFSXEbWByg78ao3dMrAAj1tyr1H1pON6P0="
205
+ ],
206
+ subnet_id="my_subnet_id",
207
+ zone="ru-central1-c",
208
+ log_group_id=LOG_GROUP_ID,
209
+ properties=None,
210
+ enable_ui_proxy=False,
211
+ host_group_ids=None,
212
+ security_group_ids=None,
213
+ labels=None,
214
+ initialization_actions=None,
215
+ environment=None,
216
+ oslogin_enabled=False,
217
+ )
218
+ context["task_instance"].xcom_push.assert_has_calls(
219
+ [
220
+ call(key="cluster_id", value=mock_create_cluster().response.id),
221
+ call(key="yandexcloud_connection_id", value=CONNECTION_ID),
222
+ ]
223
+ )
224
+
157
225
  @patch("airflow.providers.yandex.utils.credentials.get_credentials")
158
226
  @patch(f"{BASEHOOK_PATCH_PATH}.get_connection")
159
227
  @patch("yandexcloud._wrappers.dataproc.Dataproc.delete_cluster")
@@ -21,6 +21,9 @@ from datetime import datetime, timedelta
21
21
  from unittest.mock import MagicMock, call, patch
22
22
 
23
23
  import pytest
24
+
25
+ pytest.importorskip("yandexcloud")
26
+
24
27
  import responses
25
28
  from responses import matchers
26
29
 
@@ -30,8 +33,6 @@ from airflow.providers.yandex.operators.yq import YQExecuteQueryOperator
30
33
 
31
34
  from tests_common.test_utils.version_compat import AIRFLOW_V_3_0_PLUS
32
35
 
33
- yandexcloud = pytest.importorskip("yandexcloud")
34
-
35
36
  try:
36
37
  import importlib.util
37
38
 
@@ -20,6 +20,9 @@ import json
20
20
  from unittest.mock import MagicMock, Mock, patch
21
21
 
22
22
  import pytest
23
+
24
+ yandexcloud = pytest.importorskip("yandexcloud")
25
+
23
26
  import yandex.cloud.lockbox.v1.payload_pb2 as payload_pb
24
27
  import yandex.cloud.lockbox.v1.secret_pb2 as secret_pb
25
28
  import yandex.cloud.lockbox.v1.secret_service_pb2 as secret_service_pb
@@ -27,8 +30,6 @@ import yandex.cloud.lockbox.v1.secret_service_pb2 as secret_service_pb
27
30
  from airflow.providers.yandex.secrets.lockbox import LockboxSecretBackend
28
31
  from airflow.providers.yandex.utils.defaults import default_conn_name
29
32
 
30
- yandexcloud = pytest.importorskip("yandexcloud")
31
-
32
33
 
33
34
  class TestLockboxSecretBackend:
34
35
  @patch("airflow.providers.yandex.secrets.lockbox.LockboxSecretBackend._get_secret_value")