32c7336bf6
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.7 KiB
4.7 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | params | output | tested | tests | test_file_path | file_path | ||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| discover_local_services | function | py | infra | 1.1.0 | impure | discover_local_services(manifest_path: str, include_registry: bool = True) -> list[dict] | Descubre los servicios locales del sistema local_hub expuestos como subdominios *.localhost. Lee el manifiesto YAML, normaliza la metadata de cada servicio, opcionalmente añade los servicios del registry con puerto via fn doctor, y comprueba up/down por chequeo de puerto TCP en 127.0.0.1. Robusta: no lanza por servicio caido (up=False) ni por fallo de fn doctor. |
|
false | error_go_core |
|
|
lista de dicts normalizados, cada uno con las claves name, subdomain, port, health_path, title, icon, category, rewrite_host (bool, passthrough del manifiesto; False para servicios del registry; lo consume render_caddyfile para reescribir el header Host), up (bool de estado vivo por puerto TCP) | true |
|
python/functions/infra/discover_local_services_test.py | python/functions/infra/discover_local_services.py |
Ejemplo
from discover_local_services import discover_local_services
# Solo manifiesto (sin tocar el registry):
servicios = discover_local_services(
"apps/local_hub/local_services.yaml",
include_registry=False,
)
for s in servicios:
estado = "UP" if s["up"] else "DOWN"
print(f'{s["title"]:<16} {s["subdomain"]}.localhost -> :{s["port"]} [{estado}]')
# Manifiesto + servicios del registry con puerto:
todos = discover_local_services("apps/local_hub/local_services.yaml")
print(len([s for s in todos if s["up"]]), "servicios vivos")
Como script (imprime JSON a stdout):
python/.venv/bin/python3 python/functions/infra/discover_local_services.py apps/local_hub/local_services.yaml
Cuando usarla
Úsala como fase de descubrimiento del sistema local_hub antes de renderizar el
Caddyfile o la config de Glance: cuando necesites la lista normalizada de servicios
locales (*.localhost) con su estado up/down resuelto. También cuando quieras un
inventario unificado de servicios manuales (contenedores, daemons de terceros) más
los servicios del registry con puerto, deduplicados.
Gotchas
upse decide por conexión TCP a127.0.0.1:<port>con timeout 0.5s, NO por GET HTTP. Un servicio puede aceptar la conexión y devolver 404/500 en/y aun así marcarup=True. Es intencional: solo valida que el puerto esté escuchando.- Solo comprueba
127.0.0.1(loopback). Servicios que bindean únicamente a otra interfaz se reportan comodown. include_registry=Trueejecutafn doctor services-spec --json(fallback aservices --json) como subproceso desde la raíz del repo. Sifnno está, falla, tarda más de 20s o devuelve JSON inválido, la función no lanza: sigue solo con el manifiesto. Por eso el resultado puede variar según el entorno.- La raíz del repo se resuelve por
FN_REGISTRY_ROOTo subiendo directorios hasta encontrarregistry.db. Si no la encuentra, usa el cwd. - El dedup del registry es por
portY porsubdomain: un servicio del registry cuyo puerto o subdominio derivado ya esté en el manifiesto se omite. - El subdominio de un servicio del registry se deriva por una tabla de alias
(
dag_engine->dag,registry_api->registry,sqlite_api->sqlite,osint_db->osint, ...) y, para el resto, el primer token antes de_. - Lanza
RuntimeErrorsolo si el manifiesto no se puede leer o parsear (path inexistente, YAML inválido). Eso sí es un error duro. - La clave
rewrite_hostes passthrough del manifiesto (defaultFalse); para los servicios añadidos desde el registry siempre esFalse. La consumerender_caddyfilepara emitirheader_up Hosten el bloque del servicio.
Capability growth log
- v1.1.0 (2026-06-20) — añade clave rewrite_host (passthrough del manifiesto) para que render_caddyfile reescriba el Host