Split WebCRT and API startup; default collectors to worker process.

Extract channel/session modules and CLI guard, move UME sidebands out of main, and default NETX_RUN_INLINE_SCHEDULERS off so ops run python -m netx_api.worker.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-08-02 16:50:52 +08:00
parent 57b3faf9fb
commit 136f40cdae
16 changed files with 2269 additions and 2150 deletions

View file

@ -106,6 +106,12 @@ class NeExecValidationTests(unittest.TestCase):
_validate_command("ip address 1.1.1.1 255.255.255.0")
self.assertEqual(ctx.exception.detail, "command_blocked")
def test_blocks_vendor_destructive(self) -> None:
for cmd in ("save", "request system reboot", "clear configuration", "file delete flash:/x"):
with self.assertRaises(HTTPException) as ctx:
_validate_command(cmd)
self.assertEqual(ctx.exception.detail, "command_blocked", cmd)
def test_agent_batch_rejects_configure_before_connect(self) -> None:
cmds = [
"show interface",

View file

@ -38,12 +38,13 @@ class SchemaPatchesTests(unittest.TestCase):
apply_domain_schema_patches(conn)
apply_domain_schema_patches(conn)
def test_alembic_auto_defaults(self) -> None:
def test_worker_default_off_inline(self) -> None:
from netx_api.config import Settings
s = Settings(_env_file=None)
self.assertFalse(s.run_inline_schedulers)
self.assertTrue(s.alembic_upgrade_on_start)
self.assertTrue(s.skip_legacy_startup_ddl)
versions = Path(__file__).resolve().parents[1] / "alembic" / "versions"
files = sorted(p.name for p in versions.glob("*.py") if p.name != "__init__.py")
self.assertIn("20260802_scopes.py", files)