From d6f2a79fb89b9ae12e3fca1c9f31dbf7f8421798 Mon Sep 17 00:00:00 2001 From: Andrew Norman Date: Mon, 29 Jun 2026 14:48:01 -0500 Subject: [PATCH] Add mu2edaq-discovery auto-discovery support Embeds a standard mu2edaq-discovery Responder (multicast protocol) in the server so the app appears in mu2edaq-discover scans and the control room browser. Advertises the HTTP port (scheme http). This is separate from the resource manager's existing UDP-broadcast discovery (MU2E-RM-DISCOVER-V1), which is left intact. Started before uvicorn serves and stopped on shutdown; best-effort import. Adds mu2edaq-discovery to requirements.txt. Closes #6 Co-Authored-By: Claude Opus 4.8 --- requirements.txt | 2 ++ server/mu2e-resource-manager.py | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c75f50a..a63707d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,5 @@ uvicorn[standard]>=0.29.0 pyyaml>=6.0 requests>=2.31.0 python-dotenv>=1.0.0 +# Mu2e DAQ service discovery (stdlib-only; from the sibling submodule). +mu2edaq-discovery diff --git a/server/mu2e-resource-manager.py b/server/mu2e-resource-manager.py index dfb44db..1a51206 100644 --- a/server/mu2e-resource-manager.py +++ b/server/mu2e-resource-manager.py @@ -233,7 +233,25 @@ def parse_args(): responder.start() print(f"Discovery: UDP port {args.discovery_port} (broadcast)") - uvicorn.run(app, host=args.host, port=args.port) + # Mu2e DAQ service discovery (standard multicast protocol): advertise the + # HTTP port so the app appears in mu2edaq-discover scans and the control + # room browser. Separate from the resource manager's own UDP broadcast + # discovery above. Best-effort so a missing package never blocks startup. + mu2e_responder = None + try: + from mu2edaq_discovery import Responder + mu2e_responder = Responder(name="Resource Manager", + app="resource-manager", + port=args.port, scheme="http") + mu2e_responder.start() + except Exception as exc: + print(f"[Discovery] mu2edaq responder not started: {exc}") + + try: + uvicorn.run(app, host=args.host, port=args.port) + finally: + if mu2e_responder is not None: + mu2e_responder.stop() else: # When imported (e.g., by uvicorn directly), use defaults rm = ResourceManager(