mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-04-25 11:18:22 +00:00
* feat(provisioner): add optional PVC support for sandbox volumes (#1978) Add SKILLS_PVC_NAME and USERDATA_PVC_NAME env vars to allow sandbox Pods to use PersistentVolumeClaims instead of hostPath volumes. This prevents data loss in production when pods are rescheduled across nodes. When USERDATA_PVC_NAME is set, a subPath of threads/{thread_id}/user-data is used so a single PVC can serve multiple threads. Falls back to hostPath when the new env vars are not set, preserving backward compatibility. * add unit test for provisioner pvc volumes * refactor: extract shared provisioner_module fixture to conftest.py Agent-Logs-Url: https://github.com/bytedance/deer-flow/sessions/e7ccf708-c6ba-40e4-844a-b526bdb249dd Co-authored-by: WillemJiang <219644+WillemJiang@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: JeffJiang <for-eleven@hotmail.com>
56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
"""Test configuration for the backend test suite.
|
|
|
|
Sets up sys.path and pre-mocks modules that would cause circular import
|
|
issues when unit-testing lightweight config/registry code in isolation.
|
|
"""
|
|
|
|
import importlib.util
|
|
import sys
|
|
from pathlib import Path
|
|
from unittest.mock import MagicMock
|
|
|
|
import pytest
|
|
|
|
# Make 'app' and 'deerflow' importable from any working directory
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "scripts"))
|
|
|
|
# Break the circular import chain that exists in production code:
|
|
# deerflow.subagents.__init__
|
|
# -> .executor (SubagentExecutor, SubagentResult)
|
|
# -> deerflow.agents.thread_state
|
|
# -> deerflow.agents.__init__
|
|
# -> lead_agent.agent
|
|
# -> subagent_limit_middleware
|
|
# -> deerflow.subagents.executor <-- circular!
|
|
#
|
|
# By injecting a mock for deerflow.subagents.executor *before* any test module
|
|
# triggers the import, __init__.py's "from .executor import ..." succeeds
|
|
# immediately without running the real executor module.
|
|
_executor_mock = MagicMock()
|
|
_executor_mock.SubagentExecutor = MagicMock
|
|
_executor_mock.SubagentResult = MagicMock
|
|
_executor_mock.SubagentStatus = MagicMock
|
|
_executor_mock.MAX_CONCURRENT_SUBAGENTS = 3
|
|
_executor_mock.get_background_task_result = MagicMock()
|
|
|
|
sys.modules["deerflow.subagents.executor"] = _executor_mock
|
|
|
|
|
|
@pytest.fixture()
|
|
def provisioner_module():
|
|
"""Load docker/provisioner/app.py as an importable test module.
|
|
|
|
Shared by test_provisioner_kubeconfig and test_provisioner_pvc_volumes so
|
|
that any change to the provisioner entry-point path or module name only
|
|
needs to be updated in one place.
|
|
"""
|
|
repo_root = Path(__file__).resolve().parents[2]
|
|
module_path = repo_root / "docker" / "provisioner" / "app.py"
|
|
spec = importlib.util.spec_from_file_location("provisioner_app_test", module_path)
|
|
assert spec is not None
|
|
assert spec.loader is not None
|
|
module = importlib.util.module_from_spec(spec)
|
|
spec.loader.exec_module(module)
|
|
return module
|