Add `tpt_bind_addrs` and separate registry eps

Thread a `tpt_bind_addrs` param through
`open_piker_runtime()` and `open_pikerd()` so
pikerd's bind addrs can differ from the registry
endpoint (support a dedicated `regd` service).
Simplify `load_trans_eps()` to delegate entirely
to `tractor.discovery.parse_endpoints()`.

Deats,
- `conf.toml`: fix maddr prefixes to proper `/ip4/` and `/unix/`, add
  `chart` endpoints section, add commented `regd` example.
- `cli/__init__.py`: replace `parse_maddr` with `parse_endpoints`,
  rename `--maddr` -> `--maddrs`, parse `regd` key from eps falling back
  to `pikerd` addrs.
- `_actor_runtime.py`: thread `tpt_bind_addrs` through runtime open fns
  to `open_root_actor`.
- `ui/cli.py`: activate `network` config parsing for chart CLI, extract
  `chart` eps for bind and `regd`/`pikerd` for registry, pass
  `tpt_bind_addrs` through runtime config.

(this commit msg was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
maddr_endpoints
Gud Boi 2026-04-14 12:20:57 -04:00
parent d326eaccca
commit 573ee3e7a3
4 changed files with 76 additions and 68 deletions

View File

@ -1,9 +1,26 @@
[network]
pikerd = [
'/ipv/127.0.0.1/tcp/6116', # TCP localhost loopback
# TCP localhost loopback
'/ip4/127.0.0.1/tcp/6116',
# '/uds/run/user/1000/piker/pikerd@6116.sock', # UDS socket path using `multiaddr` lib!
# same but UDS
'/unix/run/user/1000/piker/pikerd.sock',
]
chart = [
'/ip4/127.0.0.1/tcp/3003',
'/unix/run/user/1000/piker/chart.sock',
]
# the service-actor registry endpoint;
# other pikerd trees contact this to discover
# actors.
# XXX if absent, pikerd binds the registry
# on its own tpt_bind_addrs.
# regd = ['/ip4/127.0.0.1/tcp/6116']
# chart = [
# '/ip4/127.0.0.1/tcp/3333',
# '/unix/run/user/1000/piker/chart@3333.sock',
# ]
[ui]

View File

@ -27,7 +27,7 @@ from types import ModuleType
import click
import trio
import tractor
from tractor.discovery._multiaddr import parse_maddr
from tractor.discovery import parse_endpoints
from ..log import (
get_console_log,
@ -47,47 +47,24 @@ log = get_logger('piker.cli')
def load_trans_eps(
network: dict|None = None,
maddrs: list[tuple] | None = None,
maddrs: list[str]|None = None,
) -> dict[str, dict[str, dict]]:
) -> dict[str, list]:
'''
Load transport endpoints from a `[network]` config
table or CLI-provided multiaddr strings, delegating
to `tractor.discovery.parse_endpoints()`.
# transport-oriented endpoint multi-addresses
eps: dict[
str, # service name, eg. `pikerd`, `emsd`..
# libp2p style multi-addresses parsed into prot layers
list[dict[str, str | int]]
] = {}
if (
network
and
not maddrs
):
# load network section and (attempt to) connect all endpoints
# which are reachable B)
for key, maddrs in network.items():
match key:
# TODO: resolve table across multiple discov
# prots Bo
case 'resolv':
pass
case 'pikerd':
dname: str = key
for maddr in maddrs:
layers: dict = parse_maddr(maddr)
eps.setdefault(
dname,
[],
).append(layers)
'''
if network and not maddrs:
return parse_endpoints(network)
elif maddrs:
# presume user is manually specifying the root actor ep.
eps['pikerd'] = [parse_maddr(maddr)]
return parse_endpoints(
{'pikerd': list(maddrs)}
)
return eps
return {}
@click.command()
@ -108,13 +85,13 @@ def load_trans_eps(
help='Enable tractor debug mode',
)
@click.option(
'--maddr',
'--maddrs',
'-m',
default=None,
help='Multiaddrs to bind or contact',
)
def pikerd(
maddr: list[str] | None,
maddrs: list[str]|None,
loglevel: str,
tl: bool,
pdb: bool,
@ -145,7 +122,8 @@ def pikerd(
))
# service-actor registry endpoint socket-address set
regaddrs: list[tuple[str, int]] = []
regaddrs: list = []
tpt_bind_addrs: list|None = None
conf, _ = config.load(
conf_name='conf',
@ -153,7 +131,8 @@ def pikerd(
network: dict = conf.get('network')
if (
network is None
and not maddr
and
not maddrs
):
regaddrs = [(
_default_registry_host,
@ -165,11 +144,19 @@ def pikerd(
with maybe_open_crash_handler(pdb=pdb):
eps: dict[str, list] = load_trans_eps(
network,
maddr,
maddrs,
)
# pikerd bind addresses (may differ from
# registry if regd is separate)
tpt_bind_addrs = eps.get('pikerd')
# registry: dedicated `regd` key, or fall
# back to pikerd addrs (pikerd IS the registry)
regaddrs = eps.get(
'regd',
tpt_bind_addrs,
)
addrs: list[tractor.Address] = eps['pikerd']
for addr in addrs:
regaddrs.append(addr)
from .. import service
@ -178,6 +165,7 @@ def pikerd(
async with (
service.open_pikerd(
registry_addrs=regaddrs,
tpt_bind_addrs=tpt_bind_addrs,
loglevel=loglevel,
debug_mode=pdb,
# enable_transports=['uds'],

View File

@ -59,6 +59,7 @@ def get_runtime_vars() -> dict[str, Any]:
async def open_piker_runtime(
name: str,
registry_addrs: list[tuple[str, int]] = [],
tpt_bind_addrs: list|None = None,
enable_modules: list[str] = [],
loglevel: str|None = None,
@ -112,6 +113,7 @@ async def open_piker_runtime(
# passed through to `open_root_actor`
registry_addrs=registry_addrs,
tpt_bind_addrs=tpt_bind_addrs,
name=name,
start_method=start_method,
loglevel=loglevel,
@ -166,6 +168,7 @@ _root_modules: list[str] = [
@acm
async def open_pikerd(
registry_addrs: list[tuple[str, int]],
tpt_bind_addrs: list|None = None,
loglevel: str|None = None,
# XXX: you should pretty much never want debug mode
@ -198,6 +201,7 @@ async def open_pikerd(
loglevel=loglevel,
debug_mode=debug_mode,
registry_addrs=registry_addrs,
tpt_bind_addrs=tpt_bind_addrs,
**kwargs,

View File

@ -195,30 +195,28 @@ def chart(
conf_name='conf',
)
regaddrs: list[tuple[str, int]] = config.get(
regaddrs: list = config.get(
'registry_addrs',
[],
)
# network: dict = conf.get('network')
# if network:
# eps: dict = load_trans_eps(
# network,
# maddrs=None,
# )
# addr: tractor.Address
# for addr in eps['pikerd']:
# regaddrs.append(addr)
network: dict = conf.get('network')
if network:
eps: dict = load_trans_eps(
network,
maddrs=None,
)
# # !TODO, expose this from open_root_actor()!
# tpt_bind_addrs: list[
# tractor.Address # `Address.get_random()` case
# |tractor.UnwrappedAddress # registrar case `= uw_reg_addrs`
# ] = []
# chart_maddrs: list[str] = eps.get('chart')
# if chart_maddrs:
# addr: tractor.Address
# for addr in load_trans_eps(chart_maddrs):
# tpt_bind_addrs.append(addr)
# registry addrs: prefer `regd`, fall back
# to `pikerd` eps
reg_eps = eps.get(
'regd',
eps.get('pikerd')
)
assert reg_eps
regaddrs = [
addr.unwrap() for addr in reg_eps
]
chart_eps = eps.get('chart')
_main(
syms=symbols,
@ -229,6 +227,7 @@ def chart(
'loglevel': tractorloglevel,
'name': 'chart',
'registry_addrs': list(set(regaddrs)),
'tpt_bind_addrs': chart_eps,
'enable_modules': [
# remote data-view annotations Bo