This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 91e6e6055b support auth key from content and from file (#40390)
91e6e6055b is described below
commit 91e6e6055b3241aae7e1593bd9b855682c733e7d
Author: uzhastik <[email protected]>
AuthorDate: Thu Jun 27 16:57:34 2024 +0300
support auth key from content and from file (#40390)
* support auth key from content and from file
* add logs
* fix static check
---
airflow/providers/ydb/provider.yaml | 2 +-
airflow/providers/ydb/utils/credentials.py | 15 +++++++---
generated/provider_dependencies.json | 2 +-
tests/providers/ydb/utils/test_credentials.py | 40 ++++++++++++++++++++++++---
4 files changed, 49 insertions(+), 10 deletions(-)
diff --git a/airflow/providers/ydb/provider.yaml
b/airflow/providers/ydb/provider.yaml
index 944df92043..e6d21dcbb1 100644
--- a/airflow/providers/ydb/provider.yaml
+++ b/airflow/providers/ydb/provider.yaml
@@ -30,7 +30,7 @@ versions:
dependencies:
- apache-airflow>=2.7.0
- apache-airflow-providers-common-sql>=1.3.1
- - ydb>=3.11.3
+ - ydb>=3.12.1
integrations:
- integration-name: YDB
diff --git a/airflow/providers/ydb/utils/credentials.py
b/airflow/providers/ydb/utils/credentials.py
index 61e08ac109..db468accf5 100644
--- a/airflow/providers/ydb/utils/credentials.py
+++ b/airflow/providers/ydb/utils/credentials.py
@@ -16,16 +16,17 @@
# under the License.
from __future__ import annotations
+import logging
from typing import TYPE_CHECKING, Any
import ydb
import ydb.iam.auth as auth
-from airflow.exceptions import AirflowException
-
if TYPE_CHECKING:
from airflow.models.connection import Connection
+log = logging.getLogger(__name__)
+
def get_credentials_from_connection(
endpoint: str, database: str, connection: Connection, connection_extra:
dict[str, Any] | None = None
@@ -54,23 +55,29 @@ def get_credentials_from_connection(
database=database,
)
+ log.info("using login as credentials")
return ydb.StaticCredentials(driver_config, user=connection.login,
password=connection.password)
connection_extra = connection_extra or {}
token = connection_extra.get("token")
if token:
+ log.info("using token as credentials")
return ydb.AccessTokenCredentials(token)
service_account_json_path =
connection_extra.get("service_account_json_path")
if service_account_json_path:
- return
auth.BaseJWTCredentials.from_file(auth.ServiceAccountCredentials,
service_account_json_path)
+ log.info("using service_account_json_path as credentials")
+ return
auth.ServiceAccountCredentials.from_file(service_account_json_path)
service_account_json = connection_extra.get("service_account_json")
if service_account_json:
- raise AirflowException("service_account_json parameter is not
supported yet")
+ log.info("using service_account_json as credentials")
+ return
auth.ServiceAccountCredentials.from_content(service_account_json)
use_vm_metadata = connection_extra.get("use_vm_metadata", False)
if use_vm_metadata:
+ log.info("using vm metadata as credentials")
return auth.MetadataUrlCredentials()
+ log.info("using anonymous access")
return ydb.AnonymousCredentials()
diff --git a/generated/provider_dependencies.json
b/generated/provider_dependencies.json
index f4760e5a0a..9f0e85f5cd 100644
--- a/generated/provider_dependencies.json
+++ b/generated/provider_dependencies.json
@@ -1343,7 +1343,7 @@
"deps": [
"apache-airflow-providers-common-sql>=1.3.1",
"apache-airflow>=2.7.0",
- "ydb>=3.11.3"
+ "ydb>=3.12.1"
],
"devel-deps": [],
"plugins": [],
diff --git a/tests/providers/ydb/utils/test_credentials.py
b/tests/providers/ydb/utils/test_credentials.py
index 864069ddbc..af0d58cddd 100644
--- a/tests/providers/ydb/utils/test_credentials.py
+++ b/tests/providers/ydb/utils/test_credentials.py
@@ -68,6 +68,20 @@ def test_vm_metadata_creds(mock):
mock.assert_called_once()
+@patch("ydb.iam.auth.BaseJWTCredentials.from_content")
+def test_service_account_json_creds(mock):
+ mock.return_value = MAGIC_CONST
+ c = Connection(conn_type="ydb", host="localhost")
+
+ credentials = get_credentials_from_connection(
+ TEST_ENDPOINT, TEST_DATABASE, c, {"service_account_json": "my_json"}
+ )
+ assert credentials == MAGIC_CONST
+ mock.assert_called_once()
+
+ assert mock.call_args.args == ("my_json",)
+
+
@patch("ydb.iam.auth.BaseJWTCredentials.from_file")
def test_service_account_json_path_creds(mock):
mock.return_value = MAGIC_CONST
@@ -79,8 +93,7 @@ def test_service_account_json_path_creds(mock):
assert credentials == MAGIC_CONST
mock.assert_called_once()
- assert len(mock.call_args.args) == 2
- assert mock.call_args.args[1] == "my_path"
+ assert mock.call_args.args == ("my_path",)
def test_creds_priority():
@@ -93,6 +106,7 @@ def test_creds_priority():
TEST_DATABASE,
c,
{
+ "service_account_json": "my_json",
"service_account_json_path": "my_path",
"use_vm_metadata": True,
"token": "my_token",
@@ -110,6 +124,7 @@ def test_creds_priority():
TEST_DATABASE,
c,
{
+ "service_account_json": "my_json",
"service_account_json_path": "my_path",
"use_vm_metadata": True,
"token": "my_token",
@@ -127,6 +142,7 @@ def test_creds_priority():
TEST_DATABASE,
c,
{
+ "service_account_json": "my_json",
"service_account_json_path": "my_path",
"use_vm_metadata": True,
},
@@ -134,7 +150,23 @@ def test_creds_priority():
assert credentials == MAGIC_CONST
mock.assert_called_once()
- # 4. vm metadata
+ # 4. service account json
+ with patch("ydb.iam.auth.BaseJWTCredentials.from_content") as mock:
+ c = Connection(conn_type="ydb", host="localhost")
+ mock.return_value = MAGIC_CONST
+ credentials = get_credentials_from_connection(
+ TEST_ENDPOINT,
+ TEST_DATABASE,
+ c,
+ {
+ "service_account_json": "my_json",
+ "use_vm_metadata": True,
+ },
+ )
+ assert credentials == MAGIC_CONST
+ mock.assert_called_once()
+
+ # 5. vm metadata
with patch("ydb.iam.auth.MetadataUrlCredentials") as mock:
c = Connection(conn_type="ydb", host="localhost")
mock.return_value = MAGIC_CONST
@@ -149,7 +181,7 @@ def test_creds_priority():
assert credentials == MAGIC_CONST
mock.assert_called_once()
- # 5. anonymous
+ # 6. anonymous
with patch("ydb.AnonymousCredentials") as mock:
c = Connection(conn_type="ydb", host="localhost")
mock.return_value = MAGIC_CONST