This is an automated email from the ASF dual-hosted git repository.
bugraoz 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 fc315f3d77f Incorrect fallback logic (#64586)
fc315f3d77f is described below
commit fc315f3d77f4029c469ebc7d8be35983edcbfc27
Author: rjgoyln <[email protected]>
AuthorDate: Wed Apr 8 02:34:30 2026 +0800
Incorrect fallback logic (#64586)
* Incorrect fallback logic
* Apply suggestions from code review
Co-authored-by: Copilot <[email protected]>
---------
Co-authored-by: Copilot <[email protected]>
---
airflow-ctl/src/airflowctl/api/client.py | 16 +++++++++++-----
airflow-ctl/tests/airflow_ctl/api/test_client.py | 18 +++++++++++++++++-
2 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/airflow-ctl/src/airflowctl/api/client.py
b/airflow-ctl/src/airflowctl/api/client.py
index 1f6a9bfd25e..d66f385576b 100644
--- a/airflow-ctl/src/airflowctl/api/client.py
+++ b/airflow-ctl/src/airflowctl/api/client.py
@@ -236,11 +236,17 @@ class Credentials:
debug_creds_path = os.path.join(
default_config_dir,
f"debug_creds_{self.input_cli_config_file}"
)
- with open(debug_creds_path) as df:
- debug_credentials = json.load(df)
- self.api_token = debug_credentials.get(
-
self.token_key_for_environment(self.api_environment)
- )
+ try:
+ with open(debug_creds_path) as df:
+ debug_credentials = json.load(df)
+ self.api_token =
debug_credentials.get(self.token_key_for_environment(self.api_environment))
+ except FileNotFoundError as e:
+ if self.client_kind == ClientKind.CLI:
+ raise AirflowCtlCredentialNotFoundException(
+ f"Debug credentials file not found:
{debug_creds_path}. "
+ "Set AIRFLOW_CLI_DEBUG_MODE=false or log in
with debug mode enabled first."
+ ) from e
+ self.api_token = None
else:
try:
self.api_token = keyring.get_password(
diff --git a/airflow-ctl/tests/airflow_ctl/api/test_client.py
b/airflow-ctl/tests/airflow_ctl/api/test_client.py
index 0617d62276a..f495b357d8d 100644
--- a/airflow-ctl/tests/airflow_ctl/api/test_client.py
+++ b/airflow-ctl/tests/airflow_ctl/api/test_client.py
@@ -30,7 +30,10 @@ from httpx import URL
from airflowctl.api.client import Client, ClientKind, Credentials,
_bounded_get_new_password
from airflowctl.api.operations import ServerResponseError
-from airflowctl.exceptions import AirflowCtlCredentialNotFoundException,
AirflowCtlKeyringException
+from airflowctl.exceptions import (
+ AirflowCtlCredentialNotFoundException,
+ AirflowCtlKeyringException,
+)
def make_client_w_responses(responses: list[httpx.Response]) -> Client:
@@ -376,3 +379,16 @@ class TestSaveKeyringPatching:
response = client.get("http://error")
assert response.status_code == 200
assert len(responses) == 1
+
+ def test_debug_mode_missing_debug_creds_reports_correct_error(self,
monkeypatch, tmp_path):
+ monkeypatch.setenv("AIRFLOW_HOME", str(tmp_path))
+ monkeypatch.setenv("AIRFLOW_CLI_DEBUG_MODE", "true")
+ monkeypatch.setenv("AIRFLOW_CLI_ENVIRONMENT", "TEST_DEBUG")
+
+ config_path = tmp_path / "TEST_DEBUG.json"
+ config_path.write_text(json.dumps({"api_url":
"http://localhost:8080"}), encoding="utf-8")
+ # Intentionally do not create debug_creds_TEST_DEBUG.json to simulate
a missing file
+
+ creds = Credentials(client_kind=ClientKind.CLI,
api_environment="TEST_DEBUG")
+ with pytest.raises(AirflowCtlCredentialNotFoundException, match="Debug
credentials file not found"):
+ creds.load()