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 604e5fcf9c
commit 5466acb764
4 changed files with 76 additions and 68 deletions

View File

@ -1,9 +1,26 @@
[network] [network]
pikerd = [ 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] [ui]

View File

@ -27,7 +27,7 @@ from types import ModuleType
import click import click
import trio import trio
import tractor import tractor
from tractor.discovery._multiaddr import parse_maddr from tractor.discovery import parse_endpoints
from ..log import ( from ..log import (
get_console_log, get_console_log,
@ -47,47 +47,24 @@ log = get_logger('piker.cli')
def load_trans_eps( def load_trans_eps(
network: dict|None = None, 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[ if network and not maddrs:
str, # service name, eg. `pikerd`, `emsd`.. return parse_endpoints(network)
# 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)
elif maddrs: elif maddrs:
# presume user is manually specifying the root actor ep. return parse_endpoints(
eps['pikerd'] = [parse_maddr(maddr)] {'pikerd': list(maddrs)}
)
return eps return {}
@click.command() @click.command()
@ -108,13 +85,13 @@ def load_trans_eps(
help='Enable tractor debug mode', help='Enable tractor debug mode',
) )
@click.option( @click.option(
'--maddr', '--maddrs',
'-m', '-m',
default=None, default=None,
help='Multiaddrs to bind or contact', help='Multiaddrs to bind or contact',
) )
def pikerd( def pikerd(
maddr: list[str] | None, maddrs: list[str]|None,
loglevel: str, loglevel: str,
tl: bool, tl: bool,
pdb: bool, pdb: bool,
@ -145,7 +122,8 @@ def pikerd(
)) ))
# service-actor registry endpoint socket-address set # service-actor registry endpoint socket-address set
regaddrs: list[tuple[str, int]] = [] regaddrs: list = []
tpt_bind_addrs: list|None = None
conf, _ = config.load( conf, _ = config.load(
conf_name='conf', conf_name='conf',
@ -153,7 +131,8 @@ def pikerd(
network: dict = conf.get('network') network: dict = conf.get('network')
if ( if (
network is None network is None
and not maddr and
not maddrs
): ):
regaddrs = [( regaddrs = [(
_default_registry_host, _default_registry_host,
@ -165,11 +144,19 @@ def pikerd(
with maybe_open_crash_handler(pdb=pdb): with maybe_open_crash_handler(pdb=pdb):
eps: dict[str, list] = load_trans_eps( eps: dict[str, list] = load_trans_eps(
network, 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 from .. import service
@ -178,6 +165,7 @@ def pikerd(
async with ( async with (
service.open_pikerd( service.open_pikerd(
registry_addrs=regaddrs, registry_addrs=regaddrs,
tpt_bind_addrs=tpt_bind_addrs,
loglevel=loglevel, loglevel=loglevel,
debug_mode=pdb, debug_mode=pdb,
# enable_transports=['uds'], # enable_transports=['uds'],

View File

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

View File

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