feat(seinode): publish per-node endpoint URLs in status#418
Conversation
Add SeiNode.status.endpoint (NodeEndpointStatus) so a follower node's in-cluster EVM/Tendermint URLs are discoverable by external orchestration. Gated on EVM-serving mode (fullNode/archive); validator/replayer surface nothing. Pure status derivation from the existing headless Service — no new Service, no RBAC change. The controller publishes the discoverable address only; readiness probing and load-balancing decisions belong to the consumer, not the controller. Unblocks the seictl/platform migration off SeiNodeDeployment: the follower RPC fleet (not the genesis validators, which don't serve EVM) becomes the load target. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
PR SummaryLow Risk Overview When phase is Running, the node reconciler sets endpoint URLs derived from the existing headless Service ( Endpoints are documented as discoverability only (not listener readiness). The controller does not clear endpoint on brief non-Running phases, to avoid status flapping. CRD/manifests and deepcopy are updated; unit and reconcile tests cover URL shape, mode nil cases, and idempotency. Reviewed by Cursor Bugbot for commit b3e9e06. Bugbot is set up for automated code reviews on this repo. Configure here. |
CRD descriptions are generated from the Go doc comments; regenerate so verify-generated matches the source. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…de RBAC (#420) * feat(seitask): WS-C — rpc scenario templates → SeiNode + provision-node RBAC - runner/rbac.yaml: grant seitask-runner `seinodes` create (provision-node's first act is c.Create(SeiNode); without it every rpc-fleet step 403s) + seinodes/status get (forward-compat, matches the /status pattern). - scenarios/{load-test,release-test}/rpc.yaml.tmpl: rewrite from a dead second `kind: SeiNetwork` (replicas:2) to a single `kind: SeiNode` fullNode follower; name/ns/ownerRef/labels/peers stamped by provision-node at runtime. Pairs with platform WS-C (chaos workflows → provision-node) and consumes the merged provision-node (#419) + SeiNode.status.endpoint (#418). HARD GATE before merge: dry-run the rendered SeiNode template against the DEPLOYED CRD (`seictl node apply … --dry-run`) — envtest only covers the repo CRD, not the live one. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * test(seitask): move rpc.yaml.tmpl render-clean guard to provisionnode The WS-C rewrite of scenarios/{load-test,release-test}/rpc.yaml.tmpl from kind: SeiNetwork to kind: SeiNode broke provisionsnd's TestBundledTemplates_RenderClean, which strict-unmarshals every bundled template as a SeiNetwork (rendered SeiNode has top-level spec.chainId, an unknown field on SeiNetworkSpec). - provisionsnd test: drop the rpc.yaml.tmpl case — it only owns the SeiNetwork genesis/validator templates now. - provisionnode test: add TestBundledTemplates_RenderClean covering both rpc.yaml.tmpl, asserting they render + strict-unmarshal as a SeiNode (spec.chainId set, spec.fullNode present). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
What
Adds
SeiNode.status.endpoint(NodeEndpointStatus) so a follower node's in-cluster URLs —evmJsonRpc,evmWs,tendermintRpc,tendermintRest— are discoverable by external orchestration. Populated only for EVM-serving modes (fullNode/archive);validator/replayerleave the field absent.Why
The migration off
SeiNodeDeploymentneeds an EVM JSON-RPC load target for the nightly chaos harness. That target must be a follower node — genesis validators runModeValidator, which disables EVM HTTP/WS — butSeiNodeStatushad no endpoint fields, so a standalone follower surfaced nothing to read.This change makes the controller expose the endpoint; it deliberately does not create load balancers or gate status on a deep health probe. The controller's job is discoverability — readiness probing and load-balancing decisions belong to the consumer (seictl / platform CICD), which picks the strategy that fits its case.
Design
<name>.<ns>.svc+seiconfig.Port*). Mirrors the existingseinetworkendpoint composition.FullNode/Archive), notnoderesource.NodeMode— which collapsesreplayer -> ModeFulland would wrongly surface endpoints for an ephemeral replayer (regression-guarded in tests)..status.endpointis a discoverability signal, not a serve-readiness guarantee (PhaseRunningis set by a no-opMarkReadyHandler); consumers probe before driving load.Tests
servesEVMtruth table; exact-URL asserts for fullNode/archive; nil for validator/replayer; reconcile-integration (fullNode->Running sets endpoint + Service exposes :8545; validator->nil; idempotent/no-churn across reconciles). All pass; node package 88.7% coverage.Provenance
Design + cross-review captured in the migration workspace (LLD
WS-A0-controller-lld.md; xreview ledger RESOLVED — kubernetes-specialist + sei-network-specialist + platform-engineer + idiomatic-reviewer). Unblocks the seictlnetwork/nodesplit (WS-A) and the platform nightly migration (WS-C).🤖 Generated with Claude Code