This is an automated email from the ASF dual-hosted git repository.
turaga 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 53eb65301e6 Warn when EdgeDBManager is missing from
external_db_managers in config (#62204)
53eb65301e6 is described below
commit 53eb65301e6953130e95781245e3774858dfca4b
Author: Dheeraj Turaga <[email protected]>
AuthorDate: Sat Feb 21 17:21:03 2026 -0600
Warn when EdgeDBManager is missing from external_db_managers in config
(#62204)
---
.../providers/edge3/executors/edge_executor.py | 3 +-
.../edge3/src/airflow/providers/edge3/models/db.py | 24 ++++++++++
.../edge3/plugins/edge_executor_plugin.py | 5 +++
providers/edge3/tests/unit/edge3/models/test_db.py | 51 ++++++++++++++++++++++
4 files changed, 82 insertions(+), 1 deletion(-)
diff --git
a/providers/edge3/src/airflow/providers/edge3/executors/edge_executor.py
b/providers/edge3/src/airflow/providers/edge3/executors/edge_executor.py
index f4a8e4b99e8..58f516ee122 100644
--- a/providers/edge3/src/airflow/providers/edge3/executors/edge_executor.py
+++ b/providers/edge3/src/airflow/providers/edge3/executors/edge_executor.py
@@ -29,7 +29,7 @@ from airflow.executors import workloads
from airflow.executors.base_executor import BaseExecutor
from airflow.models.taskinstance import TaskInstance
from airflow.providers.common.compat.sdk import Stats, timezone
-from airflow.providers.edge3.models.db import EdgeDBManager
+from airflow.providers.edge3.models.db import EdgeDBManager,
check_db_manager_config
from airflow.providers.edge3.models.edge_job import EdgeJobModel
from airflow.providers.edge3.models.edge_logs import EdgeLogsModel
from airflow.providers.edge3.models.edge_worker import EdgeWorkerModel,
EdgeWorkerState, reset_metrics
@@ -62,6 +62,7 @@ class EdgeExecutor(BaseExecutor):
@provide_session
def start(self, session: Session = NEW_SESSION):
"""If EdgeExecutor provider is loaded first time, ensure table
exists."""
+ check_db_manager_config()
edge_db_manager = EdgeDBManager(session)
if edge_db_manager.check_migration():
return
diff --git a/providers/edge3/src/airflow/providers/edge3/models/db.py
b/providers/edge3/src/airflow/providers/edge3/models/db.py
index ac61ed987c3..1207dcd704c 100644
--- a/providers/edge3/src/airflow/providers/edge3/models/db.py
+++ b/providers/edge3/src/airflow/providers/edge3/models/db.py
@@ -16,6 +16,7 @@
# under the License.
from __future__ import annotations
+import warnings
from pathlib import Path
from sqlalchemy import inspect
@@ -66,3 +67,26 @@ class EdgeDBManager(BaseDBManager):
if inspector.has_table(version.name):
self.log.info("Dropping version table %s", version.name)
version.drop(connection)
+
+
+def check_db_manager_config() -> None:
+ """
+ Warn if EdgeDBManager is not registered in the external_db_managers config.
+
+ Should be called whenever the edge3 provider is active so operators are
alerted
+ early if the required database configuration is missing.
+ """
+ from airflow.configuration import conf
+
+ fqcn = f"{EdgeDBManager.__module__}.{EdgeDBManager.__name__}"
+ configured = conf.get("database", "external_db_managers", fallback="")
+ registered = [m.strip() for m in configured.split(",") if m.strip()]
+ if fqcn not in registered:
+ warnings.warn(
+ f"EdgeDBManager is not configured. Add '{fqcn}' to "
+ f"AIRFLOW__DATABASE__EXTERNAL_DB_MANAGERS (the
'external_db_managers' option "
+ f"in the [database] section). Without this, edge3 database tables
will not be "
+ f"managed through the standard Airflow migration process.",
+ UserWarning,
+ stacklevel=2,
+ )
diff --git
a/providers/edge3/src/airflow/providers/edge3/plugins/edge_executor_plugin.py
b/providers/edge3/src/airflow/providers/edge3/plugins/edge_executor_plugin.py
index ad22956258c..c73fa5b23c1 100644
---
a/providers/edge3/src/airflow/providers/edge3/plugins/edge_executor_plugin.py
+++
b/providers/edge3/src/airflow/providers/edge3/plugins/edge_executor_plugin.py
@@ -60,6 +60,11 @@ try:
except AirflowConfigException:
EDGE_EXECUTOR_ACTIVE = False
+if EDGE_EXECUTOR_ACTIVE:
+ from airflow.providers.edge3.models.db import check_db_manager_config
+
+ check_db_manager_config()
+
# Load the API endpoint only on api-server
# TODO(jscheffl): Remove this check when the discussion in
#
https://lists.apache.org/thread/w170czq6r7bslkqp1tk6bjjjo0789wgl
diff --git a/providers/edge3/tests/unit/edge3/models/test_db.py
b/providers/edge3/tests/unit/edge3/models/test_db.py
index 79739f2847c..2ec969dc0c3 100644
--- a/providers/edge3/tests/unit/edge3/models/test_db.py
+++ b/providers/edge3/tests/unit/edge3/models/test_db.py
@@ -16,6 +16,7 @@
# under the License.
from __future__ import annotations
+import warnings
from unittest import mock
import pytest
@@ -239,3 +240,53 @@ class TestEdgeDBManager:
# The drop method should not be called on any table
# We check this by ensuring has_table was called but drop was
not
assert mock_inspector.has_table.called
+
+
+class TestCheckDbManagerConfig:
+ """Test check_db_manager_config warning helper."""
+
+ pytestmark: list = [] # no db_test needed — purely config-based
+
+ def test_warns_when_not_configured(self):
+ """Warning is emitted when EdgeDBManager is absent from
external_db_managers."""
+ from airflow.providers.edge3.models.db import check_db_manager_config
+
+ with conf_vars({("database", "external_db_managers"): ""}):
+ with pytest.warns(UserWarning, match="EdgeDBManager is not
configured"):
+ check_db_manager_config()
+
+ def test_warns_when_other_manager_configured(self):
+ """Warning is emitted when a different manager is configured but not
EdgeDBManager."""
+ from airflow.providers.edge3.models.db import check_db_manager_config
+
+ with conf_vars({("database", "external_db_managers"):
"some.other.DBManager"}):
+ with pytest.warns(UserWarning, match="EdgeDBManager is not
configured"):
+ check_db_manager_config()
+
+ def test_no_warn_when_configured(self):
+ """No warning when EdgeDBManager is properly configured."""
+ from airflow.providers.edge3.models.db import check_db_manager_config
+
+ with conf_vars(
+ {
+ ("database", "external_db_managers"):
"airflow.providers.edge3.models.db.EdgeDBManager",
+ }
+ ):
+ with warnings.catch_warnings():
+ warnings.simplefilter("error")
+ check_db_manager_config() # must not raise
+
+ def test_no_warn_when_configured_among_multiple(self):
+ """No warning when EdgeDBManager appears alongside other managers."""
+ from airflow.providers.edge3.models.db import check_db_manager_config
+
+ with conf_vars(
+ {
+ ("database", "external_db_managers"): (
+
"some.other.DBManager,airflow.providers.edge3.models.db.EdgeDBManager"
+ ),
+ }
+ ):
+ with warnings.catch_warnings():
+ warnings.simplefilter("error")
+ check_db_manager_config() # must not raise