apache-airflow-providers-hashicorp 3.7.0rc1__tar.gz → 3.7.1__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-hashicorp might be problematic. Click here for more details.
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/PKG-INFO +12 -9
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/README.rst +5 -5
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/airflow/providers/hashicorp/__init__.py +5 -8
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/airflow/providers/hashicorp/_internal_client/vault_client.py +44 -15
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/airflow/providers/hashicorp/get_provider_info.py +7 -2
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/airflow/providers/hashicorp/hooks/vault.py +8 -7
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/airflow/providers/hashicorp/secrets/vault.py +12 -7
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/pyproject.toml +8 -4
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/airflow/providers/hashicorp/LICENSE +0 -0
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/airflow/providers/hashicorp/_internal_client/__init__.py +0 -0
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/airflow/providers/hashicorp/hooks/__init__.py +0 -0
- {apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/airflow/providers/hashicorp/secrets/__init__.py +0 -0
{apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: apache-airflow-providers-hashicorp
|
|
3
|
-
Version: 3.7.
|
|
3
|
+
Version: 3.7.1
|
|
4
4
|
Summary: Provider package apache-airflow-providers-hashicorp for Apache Airflow
|
|
5
5
|
Keywords: airflow-provider,hashicorp,airflow,integration
|
|
6
6
|
Author-email: Apache Software Foundation <dev@airflow.apache.org>
|
|
@@ -19,17 +19,20 @@ Classifier: Programming Language :: Python :: 3.8
|
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.9
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.10
|
|
21
21
|
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
23
|
Classifier: Topic :: System :: Monitoring
|
|
23
|
-
Requires-Dist: apache-airflow>=2.
|
|
24
|
+
Requires-Dist: apache-airflow>=2.7.0
|
|
24
25
|
Requires-Dist: hvac>=1.1.0
|
|
26
|
+
Requires-Dist: boto3>=1.33.0 ; extra == "boto3"
|
|
25
27
|
Requires-Dist: apache-airflow-providers-google ; extra == "google"
|
|
26
28
|
Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
|
|
27
|
-
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.
|
|
28
|
-
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.
|
|
29
|
+
Project-URL: Changelog, https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.1/changelog.html
|
|
30
|
+
Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.1
|
|
29
31
|
Project-URL: Slack Chat, https://s.apache.org/airflow-slack
|
|
30
32
|
Project-URL: Source Code, https://github.com/apache/airflow
|
|
31
33
|
Project-URL: Twitter, https://twitter.com/ApacheAirflow
|
|
32
34
|
Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
|
|
35
|
+
Provides-Extra: boto3
|
|
33
36
|
Provides-Extra: google
|
|
34
37
|
|
|
35
38
|
|
|
@@ -76,7 +79,7 @@ Provides-Extra: google
|
|
|
76
79
|
|
|
77
80
|
Package ``apache-airflow-providers-hashicorp``
|
|
78
81
|
|
|
79
|
-
Release: ``3.7.
|
|
82
|
+
Release: ``3.7.1``
|
|
80
83
|
|
|
81
84
|
|
|
82
85
|
Hashicorp including `Hashicorp Vault <https://www.vaultproject.io/>`__
|
|
@@ -89,7 +92,7 @@ This is a provider package for ``hashicorp`` provider. All classes for this prov
|
|
|
89
92
|
are in ``airflow.providers.hashicorp`` python package.
|
|
90
93
|
|
|
91
94
|
You can find package information and changelog for the provider
|
|
92
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.
|
|
95
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.1/>`_.
|
|
93
96
|
|
|
94
97
|
Installation
|
|
95
98
|
------------
|
|
@@ -98,7 +101,7 @@ You can install this package on top of an existing Airflow 2 installation (see `
|
|
|
98
101
|
for the minimum Airflow version supported) via
|
|
99
102
|
``pip install apache-airflow-providers-hashicorp``
|
|
100
103
|
|
|
101
|
-
The package supports the following python versions: 3.8,3.9,3.10,3.11
|
|
104
|
+
The package supports the following python versions: 3.8,3.9,3.10,3.11,3.12
|
|
102
105
|
|
|
103
106
|
Requirements
|
|
104
107
|
------------
|
|
@@ -106,7 +109,7 @@ Requirements
|
|
|
106
109
|
================== ==================
|
|
107
110
|
PIP package Version required
|
|
108
111
|
================== ==================
|
|
109
|
-
``apache-airflow`` ``>=2.
|
|
112
|
+
``apache-airflow`` ``>=2.7.0``
|
|
110
113
|
``hvac`` ``>=1.1.0``
|
|
111
114
|
================== ==================
|
|
112
115
|
|
|
@@ -130,4 +133,4 @@ Dependent package
|
|
|
130
133
|
==================================================================================================== ==========
|
|
131
134
|
|
|
132
135
|
The changelog for the provider package can be found in the
|
|
133
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.
|
|
136
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.1/changelog.html>`_.
|
{apache_airflow_providers_hashicorp-3.7.0rc1 → apache_airflow_providers_hashicorp-3.7.1}/README.rst
RENAMED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
|
|
43
43
|
Package ``apache-airflow-providers-hashicorp``
|
|
44
44
|
|
|
45
|
-
Release: ``3.7.
|
|
45
|
+
Release: ``3.7.1``
|
|
46
46
|
|
|
47
47
|
|
|
48
48
|
Hashicorp including `Hashicorp Vault <https://www.vaultproject.io/>`__
|
|
@@ -55,7 +55,7 @@ This is a provider package for ``hashicorp`` provider. All classes for this prov
|
|
|
55
55
|
are in ``airflow.providers.hashicorp`` python package.
|
|
56
56
|
|
|
57
57
|
You can find package information and changelog for the provider
|
|
58
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.
|
|
58
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.1/>`_.
|
|
59
59
|
|
|
60
60
|
Installation
|
|
61
61
|
------------
|
|
@@ -64,7 +64,7 @@ You can install this package on top of an existing Airflow 2 installation (see `
|
|
|
64
64
|
for the minimum Airflow version supported) via
|
|
65
65
|
``pip install apache-airflow-providers-hashicorp``
|
|
66
66
|
|
|
67
|
-
The package supports the following python versions: 3.8,3.9,3.10,3.11
|
|
67
|
+
The package supports the following python versions: 3.8,3.9,3.10,3.11,3.12
|
|
68
68
|
|
|
69
69
|
Requirements
|
|
70
70
|
------------
|
|
@@ -72,7 +72,7 @@ Requirements
|
|
|
72
72
|
================== ==================
|
|
73
73
|
PIP package Version required
|
|
74
74
|
================== ==================
|
|
75
|
-
``apache-airflow`` ``>=2.
|
|
75
|
+
``apache-airflow`` ``>=2.7.0``
|
|
76
76
|
``hvac`` ``>=1.1.0``
|
|
77
77
|
================== ==================
|
|
78
78
|
|
|
@@ -96,4 +96,4 @@ Dependent package
|
|
|
96
96
|
==================================================================================================== ==========
|
|
97
97
|
|
|
98
98
|
The changelog for the provider package can be found in the
|
|
99
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.
|
|
99
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.1/changelog.html>`_.
|
|
@@ -25,18 +25,15 @@ from __future__ import annotations
|
|
|
25
25
|
|
|
26
26
|
import packaging.version
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
from airflow import __version__ as airflow_version
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
__all__ = ["__version__"]
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
from airflow import __version__ as airflow_version
|
|
34
|
-
except ImportError:
|
|
35
|
-
from airflow.version import version as airflow_version
|
|
32
|
+
__version__ = "3.7.1"
|
|
36
33
|
|
|
37
34
|
if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
|
|
38
|
-
"2.
|
|
35
|
+
"2.7.0"
|
|
39
36
|
):
|
|
40
37
|
raise RuntimeError(
|
|
41
|
-
f"The package `apache-airflow-providers-hashicorp:{__version__}` needs Apache Airflow 2.
|
|
38
|
+
f"The package `apache-airflow-providers-hashicorp:{__version__}` needs Apache Airflow 2.7.0+"
|
|
42
39
|
)
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
# under the License.
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
+
import os
|
|
19
20
|
from functools import cached_property
|
|
20
21
|
|
|
21
22
|
import hvac
|
|
@@ -73,6 +74,9 @@ class _VaultClient(LoggingMixin):
|
|
|
73
74
|
:param key_id: Key ID for Authentication (for ``aws_iam`` and ''azure`` auth_type).
|
|
74
75
|
:param secret_id: Secret ID for Authentication (for ``approle``, ``aws_iam`` and ``azure`` auth_types).
|
|
75
76
|
:param role_id: Role ID for Authentication (for ``approle``, ``aws_iam`` auth_types).
|
|
77
|
+
:param assume_role_kwargs: AWS assume role param.
|
|
78
|
+
See AWS STS Docs:
|
|
79
|
+
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sts/client/assume_role.html
|
|
76
80
|
:param kubernetes_role: Role for Authentication (for ``kubernetes`` auth_type).
|
|
77
81
|
:param kubernetes_jwt_path: Path for kubernetes jwt token (for ``kubernetes`` auth_type, default:
|
|
78
82
|
``/var/run/secrets/kubernetes.io/serviceaccount/token``).
|
|
@@ -102,6 +106,7 @@ class _VaultClient(LoggingMixin):
|
|
|
102
106
|
password: str | None = None,
|
|
103
107
|
key_id: str | None = None,
|
|
104
108
|
secret_id: str | None = None,
|
|
109
|
+
assume_role_kwargs: dict | None = None,
|
|
105
110
|
role_id: str | None = None,
|
|
106
111
|
kubernetes_role: str | None = None,
|
|
107
112
|
kubernetes_jwt_path: str | None = "/var/run/secrets/kubernetes.io/serviceaccount/token",
|
|
@@ -125,7 +130,7 @@ class _VaultClient(LoggingMixin):
|
|
|
125
130
|
raise VaultError(
|
|
126
131
|
f"The auth_type is not supported: {auth_type}. It should be one of {VALID_AUTH_TYPES}"
|
|
127
132
|
)
|
|
128
|
-
if auth_type == "token" and not token and not token_path:
|
|
133
|
+
if auth_type == "token" and not token and not token_path and "VAULT_TOKEN" not in os.environ:
|
|
129
134
|
raise VaultError("The 'token' authentication type requires 'token' or 'token_path'")
|
|
130
135
|
if auth_type == "github" and not token and not token_path:
|
|
131
136
|
raise VaultError("The 'github' authentication type requires 'token' or 'token_path'")
|
|
@@ -151,7 +156,7 @@ class _VaultClient(LoggingMixin):
|
|
|
151
156
|
self.url = url
|
|
152
157
|
self.auth_type = auth_type
|
|
153
158
|
self.kwargs = kwargs
|
|
154
|
-
self.token = token
|
|
159
|
+
self.token = token or os.getenv("VAULT_TOKEN", None)
|
|
155
160
|
self.token_path = token_path
|
|
156
161
|
self.auth_mount_point = auth_mount_point
|
|
157
162
|
self.mount_point = mount_point
|
|
@@ -160,6 +165,7 @@ class _VaultClient(LoggingMixin):
|
|
|
160
165
|
self.key_id = key_id
|
|
161
166
|
self.secret_id = secret_id
|
|
162
167
|
self.role_id = role_id
|
|
168
|
+
self.assume_role_kwargs = assume_role_kwargs
|
|
163
169
|
self.kubernetes_role = kubernetes_role
|
|
164
170
|
self.kubernetes_jwt_path = kubernetes_jwt_path
|
|
165
171
|
self.gcp_key_path = gcp_key_path
|
|
@@ -206,6 +212,8 @@ class _VaultClient(LoggingMixin):
|
|
|
206
212
|
session = Session()
|
|
207
213
|
session.mount("http://", adapter)
|
|
208
214
|
session.mount("https://", adapter)
|
|
215
|
+
if self.kwargs and "verify" in self.kwargs:
|
|
216
|
+
session.verify = self.kwargs["verify"]
|
|
209
217
|
self.kwargs["session"] = session
|
|
210
218
|
|
|
211
219
|
_client = hvac.Client(url=self.url, **self.kwargs)
|
|
@@ -317,15 +325,36 @@ class _VaultClient(LoggingMixin):
|
|
|
317
325
|
)
|
|
318
326
|
|
|
319
327
|
def _auth_aws_iam(self, _client: hvac.Client) -> None:
|
|
320
|
-
if self.
|
|
321
|
-
|
|
322
|
-
access_key
|
|
323
|
-
secret_key
|
|
324
|
-
role
|
|
325
|
-
|
|
326
|
-
)
|
|
328
|
+
if self.key_id and self.secret_id:
|
|
329
|
+
auth_args = {
|
|
330
|
+
"access_key": self.key_id,
|
|
331
|
+
"secret_key": self.secret_id,
|
|
332
|
+
"role": self.role_id,
|
|
333
|
+
}
|
|
327
334
|
else:
|
|
328
|
-
|
|
335
|
+
import boto3
|
|
336
|
+
|
|
337
|
+
if self.assume_role_kwargs:
|
|
338
|
+
sts_client = boto3.client("sts")
|
|
339
|
+
credentials = sts_client.assume_role(**self.assume_role_kwargs)
|
|
340
|
+
auth_args = {
|
|
341
|
+
"access_key": credentials["Credentials"]["AccessKeyId"],
|
|
342
|
+
"secret_key": credentials["Credentials"]["SecretAccessKey"],
|
|
343
|
+
"session_token": credentials["Credentials"]["SessionToken"],
|
|
344
|
+
}
|
|
345
|
+
else:
|
|
346
|
+
session = boto3.Session()
|
|
347
|
+
credentials = session.get_credentials()
|
|
348
|
+
auth_args = {
|
|
349
|
+
"access_key": credentials.access_key,
|
|
350
|
+
"secret_key": credentials.secret_key,
|
|
351
|
+
"session_token": credentials.token,
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if self.auth_mount_point:
|
|
355
|
+
auth_args["mount_point"] = self.auth_mount_point
|
|
356
|
+
|
|
357
|
+
_client.auth.aws.iam_login(**auth_args)
|
|
329
358
|
|
|
330
359
|
def _auth_approle(self, _client: hvac.Client) -> None:
|
|
331
360
|
if self.auth_mount_point:
|
|
@@ -387,7 +416,7 @@ class _VaultClient(LoggingMixin):
|
|
|
387
416
|
|
|
388
417
|
def get_secret_metadata(self, secret_path: str) -> dict | None:
|
|
389
418
|
"""
|
|
390
|
-
|
|
419
|
+
Read secret metadata (including versions) from the engine. It is only valid for KV version 2.
|
|
391
420
|
|
|
392
421
|
:param secret_path: The path of the secret.
|
|
393
422
|
:return: secret metadata. This is a Dict containing metadata for the secret.
|
|
@@ -409,7 +438,7 @@ class _VaultClient(LoggingMixin):
|
|
|
409
438
|
self, secret_path: str, secret_version: int | None = None
|
|
410
439
|
) -> dict | None:
|
|
411
440
|
"""
|
|
412
|
-
|
|
441
|
+
Read secret including metadata. It is only valid for KV version 2.
|
|
413
442
|
|
|
414
443
|
See https://hvac.readthedocs.io/en/stable/usage/secrets_engines/kv_v2.html for details.
|
|
415
444
|
|
|
@@ -443,7 +472,7 @@ class _VaultClient(LoggingMixin):
|
|
|
443
472
|
self, secret_path: str, secret: dict, method: str | None = None, cas: int | None = None
|
|
444
473
|
) -> Response:
|
|
445
474
|
"""
|
|
446
|
-
|
|
475
|
+
Create or updates secret.
|
|
447
476
|
|
|
448
477
|
:param secret_path: The path of the secret.
|
|
449
478
|
:param secret: Secret to create or update for the path specified
|
|
@@ -467,10 +496,10 @@ class _VaultClient(LoggingMixin):
|
|
|
467
496
|
mount_point, secret_path = self._parse_secret_path(secret_path)
|
|
468
497
|
if self.kv_engine_version == 1:
|
|
469
498
|
response = self.client.secrets.kv.v1.create_or_update_secret(
|
|
470
|
-
|
|
499
|
+
path=secret_path, secret=secret, mount_point=mount_point, method=method
|
|
471
500
|
)
|
|
472
501
|
else:
|
|
473
502
|
response = self.client.secrets.kv.v2.create_or_update_secret(
|
|
474
|
-
|
|
503
|
+
path=secret_path, secret=secret, mount_point=mount_point, cas=cas
|
|
475
504
|
)
|
|
476
505
|
return response
|
|
@@ -28,9 +28,13 @@ def get_provider_info():
|
|
|
28
28
|
"name": "Hashicorp",
|
|
29
29
|
"description": "Hashicorp including `Hashicorp Vault <https://www.vaultproject.io/>`__\n",
|
|
30
30
|
"state": "ready",
|
|
31
|
-
"source-date-epoch":
|
|
31
|
+
"source-date-epoch": 1716287935,
|
|
32
32
|
"versions": [
|
|
33
|
+
"3.7.1",
|
|
33
34
|
"3.7.0",
|
|
35
|
+
"3.6.4",
|
|
36
|
+
"3.6.3",
|
|
37
|
+
"3.6.2",
|
|
34
38
|
"3.6.1",
|
|
35
39
|
"3.6.0",
|
|
36
40
|
"3.5.0",
|
|
@@ -55,7 +59,7 @@ def get_provider_info():
|
|
|
55
59
|
"1.0.1",
|
|
56
60
|
"1.0.0",
|
|
57
61
|
],
|
|
58
|
-
"dependencies": ["apache-airflow>=2.
|
|
62
|
+
"dependencies": ["apache-airflow>=2.7.0", "hvac>=1.1.0"],
|
|
59
63
|
"integrations": [
|
|
60
64
|
{
|
|
61
65
|
"integration-name": "Hashicorp Vault",
|
|
@@ -77,4 +81,5 @@ def get_provider_info():
|
|
|
77
81
|
}
|
|
78
82
|
],
|
|
79
83
|
"secrets-backends": ["airflow.providers.hashicorp.secrets.vault.VaultBackend"],
|
|
84
|
+
"additional-extras": [{"name": "boto3", "dependencies": ["boto3>=1.33.0"]}],
|
|
80
85
|
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
# specific language governing permissions and limitations
|
|
16
16
|
# under the License.
|
|
17
17
|
"""Hook for HashiCorp Vault."""
|
|
18
|
+
|
|
18
19
|
from __future__ import annotations
|
|
19
20
|
|
|
20
21
|
import json
|
|
@@ -125,7 +126,7 @@ class VaultHook(BaseHook):
|
|
|
125
126
|
radius_port: int | None = None,
|
|
126
127
|
**kwargs,
|
|
127
128
|
):
|
|
128
|
-
super().__init__(
|
|
129
|
+
super().__init__()
|
|
129
130
|
self.connection = self.get_connection(vault_conn_id)
|
|
130
131
|
|
|
131
132
|
if not auth_type:
|
|
@@ -290,7 +291,7 @@ class VaultHook(BaseHook):
|
|
|
290
291
|
|
|
291
292
|
def get_conn(self) -> hvac.Client:
|
|
292
293
|
"""
|
|
293
|
-
|
|
294
|
+
Retrieve connection to Vault.
|
|
294
295
|
|
|
295
296
|
:return: connection used.
|
|
296
297
|
"""
|
|
@@ -313,7 +314,7 @@ class VaultHook(BaseHook):
|
|
|
313
314
|
|
|
314
315
|
def get_secret_metadata(self, secret_path: str) -> dict | None:
|
|
315
316
|
"""
|
|
316
|
-
|
|
317
|
+
Read secret metadata (including versions) from the engine. It is only valid for KV version 2.
|
|
317
318
|
|
|
318
319
|
:param secret_path: Path to read from
|
|
319
320
|
:return: secret metadata. This is a Dict containing metadata for the secret.
|
|
@@ -327,7 +328,7 @@ class VaultHook(BaseHook):
|
|
|
327
328
|
self, secret_path: str, secret_version: int | None = None
|
|
328
329
|
) -> dict | None:
|
|
329
330
|
"""
|
|
330
|
-
|
|
331
|
+
Read secret including metadata. It is only valid for KV version 2.
|
|
331
332
|
|
|
332
333
|
See https://hvac.readthedocs.io/en/stable/usage/secrets_engines/kv_v2.html for details.
|
|
333
334
|
|
|
@@ -345,7 +346,7 @@ class VaultHook(BaseHook):
|
|
|
345
346
|
self, secret_path: str, secret: dict, method: str | None = None, cas: int | None = None
|
|
346
347
|
) -> Response:
|
|
347
348
|
"""
|
|
348
|
-
|
|
349
|
+
Create or updates secret.
|
|
349
350
|
|
|
350
351
|
:param secret_path: Path to read from
|
|
351
352
|
:param secret: Secret to create or update for the path specified
|
|
@@ -368,7 +369,7 @@ class VaultHook(BaseHook):
|
|
|
368
369
|
|
|
369
370
|
@classmethod
|
|
370
371
|
def get_connection_form_widgets(cls) -> dict[str, Any]:
|
|
371
|
-
"""
|
|
372
|
+
"""Return connection widgets to add to connection form."""
|
|
372
373
|
from flask_appbuilder.fieldwidgets import BS3TextFieldWidget
|
|
373
374
|
from flask_babel import lazy_gettext
|
|
374
375
|
from wtforms import BooleanField, IntegerField, StringField
|
|
@@ -405,7 +406,7 @@ class VaultHook(BaseHook):
|
|
|
405
406
|
|
|
406
407
|
@classmethod
|
|
407
408
|
def get_ui_field_behaviour(cls) -> dict[str, Any]:
|
|
408
|
-
"""
|
|
409
|
+
"""Return custom field behaviour."""
|
|
409
410
|
return {
|
|
410
411
|
"hidden_fields": ["extra"],
|
|
411
412
|
"relabeling": {},
|
|
@@ -16,11 +16,13 @@
|
|
|
16
16
|
# specific language governing permissions and limitations
|
|
17
17
|
# under the License.
|
|
18
18
|
"""Objects relating to sourcing connections & variables from Hashicorp Vault."""
|
|
19
|
+
|
|
19
20
|
from __future__ import annotations
|
|
20
21
|
|
|
21
|
-
import warnings
|
|
22
22
|
from typing import TYPE_CHECKING
|
|
23
23
|
|
|
24
|
+
from deprecated import deprecated
|
|
25
|
+
|
|
24
26
|
from airflow.exceptions import AirflowProviderDeprecationWarning
|
|
25
27
|
from airflow.providers.hashicorp._internal_client.vault_client import _VaultClient
|
|
26
28
|
from airflow.secrets import BaseSecretsBackend
|
|
@@ -72,6 +74,9 @@ class VaultBackend(BaseSecretsBackend, LoggingMixin):
|
|
|
72
74
|
:param key_id: Key ID for Authentication (for ``aws_iam`` and ''azure`` auth_type).
|
|
73
75
|
:param secret_id: Secret ID for Authentication (for ``approle``, ``aws_iam`` and ``azure`` auth_types).
|
|
74
76
|
:param role_id: Role ID for Authentication (for ``approle``, ``aws_iam`` auth_types).
|
|
77
|
+
:param assume_role_kwargs: AWS assume role param.
|
|
78
|
+
See AWS STS Docs:
|
|
79
|
+
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sts/client/assume_role.html
|
|
75
80
|
:param kubernetes_role: Role for Authentication (for ``kubernetes`` auth_type).
|
|
76
81
|
:param kubernetes_jwt_path: Path for kubernetes jwt token (for ``kubernetes`` auth_type, default:
|
|
77
82
|
``/var/run/secrets/kubernetes.io/serviceaccount/token``).
|
|
@@ -105,6 +110,7 @@ class VaultBackend(BaseSecretsBackend, LoggingMixin):
|
|
|
105
110
|
key_id: str | None = None,
|
|
106
111
|
secret_id: str | None = None,
|
|
107
112
|
role_id: str | None = None,
|
|
113
|
+
assume_role_kwargs: dict | None = None,
|
|
108
114
|
kubernetes_role: str | None = None,
|
|
109
115
|
kubernetes_jwt_path: str = "/var/run/secrets/kubernetes.io/serviceaccount/token",
|
|
110
116
|
gcp_key_path: str | None = None,
|
|
@@ -145,6 +151,7 @@ class VaultBackend(BaseSecretsBackend, LoggingMixin):
|
|
|
145
151
|
key_id=key_id,
|
|
146
152
|
secret_id=secret_id,
|
|
147
153
|
role_id=role_id,
|
|
154
|
+
assume_role_kwargs=assume_role_kwargs,
|
|
148
155
|
kubernetes_role=kubernetes_role,
|
|
149
156
|
kubernetes_jwt_path=kubernetes_jwt_path,
|
|
150
157
|
gcp_key_path=gcp_key_path,
|
|
@@ -184,6 +191,10 @@ class VaultBackend(BaseSecretsBackend, LoggingMixin):
|
|
|
184
191
|
secret_path=(mount_point + "/" if mount_point else "") + secret_path
|
|
185
192
|
)
|
|
186
193
|
|
|
194
|
+
@deprecated(
|
|
195
|
+
reason="Method `VaultBackend.get_conn_uri` is deprecated and will be removed in a future release.",
|
|
196
|
+
category=AirflowProviderDeprecationWarning,
|
|
197
|
+
)
|
|
187
198
|
def get_conn_uri(self, conn_id: str) -> str | None:
|
|
188
199
|
"""
|
|
189
200
|
Get serialized representation of connection.
|
|
@@ -193,12 +204,6 @@ class VaultBackend(BaseSecretsBackend, LoggingMixin):
|
|
|
193
204
|
"""
|
|
194
205
|
# Since VaultBackend implements `get_connection`, `get_conn_uri` is not used. So we
|
|
195
206
|
# don't need to implement (or direct users to use) method `get_conn_value` instead
|
|
196
|
-
warnings.warn(
|
|
197
|
-
f"Method `{self.__class__.__name__}.get_conn_uri` is deprecated and will be removed "
|
|
198
|
-
"in a future release.",
|
|
199
|
-
AirflowProviderDeprecationWarning,
|
|
200
|
-
stacklevel=2,
|
|
201
|
-
)
|
|
202
207
|
response = self.get_response(conn_id)
|
|
203
208
|
return response.get("conn_uri") if response else None
|
|
204
209
|
|
|
@@ -28,7 +28,7 @@ build-backend = "flit_core.buildapi"
|
|
|
28
28
|
|
|
29
29
|
[project]
|
|
30
30
|
name = "apache-airflow-providers-hashicorp"
|
|
31
|
-
version = "3.7.
|
|
31
|
+
version = "3.7.1"
|
|
32
32
|
description = "Provider package apache-airflow-providers-hashicorp for Apache Airflow"
|
|
33
33
|
readme = "README.rst"
|
|
34
34
|
authors = [
|
|
@@ -51,17 +51,18 @@ classifiers = [
|
|
|
51
51
|
"Programming Language :: Python :: 3.9",
|
|
52
52
|
"Programming Language :: Python :: 3.10",
|
|
53
53
|
"Programming Language :: Python :: 3.11",
|
|
54
|
+
"Programming Language :: Python :: 3.12",
|
|
54
55
|
"Topic :: System :: Monitoring",
|
|
55
56
|
]
|
|
56
57
|
requires-python = "~=3.8"
|
|
57
58
|
dependencies = [
|
|
58
|
-
"apache-airflow>=2.
|
|
59
|
+
"apache-airflow>=2.7.0",
|
|
59
60
|
"hvac>=1.1.0",
|
|
60
61
|
]
|
|
61
62
|
|
|
62
63
|
[project.urls]
|
|
63
|
-
"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.
|
|
64
|
-
"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.
|
|
64
|
+
"Documentation" = "https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.1"
|
|
65
|
+
"Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/3.7.1/changelog.html"
|
|
65
66
|
"Bug Tracker" = "https://github.com/apache/airflow/issues"
|
|
66
67
|
"Source Code" = "https://github.com/apache/airflow"
|
|
67
68
|
"Slack Chat" = "https://s.apache.org/airflow-slack"
|
|
@@ -74,6 +75,9 @@ provider_info = "airflow.providers.hashicorp.get_provider_info:get_provider_info
|
|
|
74
75
|
"google" = [
|
|
75
76
|
"apache-airflow-providers-google",
|
|
76
77
|
]
|
|
78
|
+
"boto3" = [
|
|
79
|
+
"boto3>=1.33.0",
|
|
80
|
+
]
|
|
77
81
|
|
|
78
82
|
[tool.flit.module]
|
|
79
83
|
name = "airflow.providers.hashicorp"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|