Skip to content

Nodes

Partial

A node is the edge runtime that collects from and controls gear wherever it sits: it pulls its worklist from the server, runs it on the spot, and ships results back. This page covers worklist pull, placement, tasks and commands, sessions, inbound demux, the task queue, reachability, and shipping telemetry; the declarative shape it executes lives in templates and collection.

The node is the edge process (omniglass node run), one per site, or the server itself when no site-local edge exists (see Placement). Identity is bound to node.name (a compromised node cannot impersonate another, identity-access); it holds no config, and its writes are confined to its placement-derived visible_set (the owners of its assigned tasks): node mode, not all-visibility system mode.

A node carries the identity triad with one exception. Its id is principal_id, the immutable primary key every reference stores (a node is the detail row of a principal, and interface.node_name holds that uuid whatever its column name suggests). Its name is the operator-typed identifier and fleet address, the NATS subject token and the enrollment identity, and it is the one name with no :rename custom method: moving it would move a live subject, so the PATCH body carries no name at all. Its label is the operator label (console falls back to the name). Its optional location is descriptive, not a scope: a node stays fleet-wide, location clearing if that location is deleted (ON DELETE SET NULL). Descriptive does not mean unguarded: the create and the update resolve that reference within the caller’s own location:read scope, the seam every other placement bind uses, and a location outside it is refused as absent rather than as forbidden (ADR-0089, amended by #705). The console blade is read-edit-save via PATCH /nodes/{name} (Edit primary, gated node:update, editing label, description, location; name read-only; enrolling secondary).

A node is a taggable owner: governed tags whose applies_to includes node bind to it (fleet-wide, all-scope, node:update); effective tags are the platform layer plus direct bindings, no cascade (a node is not a scope tree); the blade carries a Tags panel, the list a Tags column and per-key facet. Decommissioning (DELETE /nodes/{name}, node:delete) hard-deletes, cascading its interfaces, their derived tasks, its node-owned tags and self-telemetry, and its enrollment credential; collected component telemetry is untouched.

The node pulls a worklist (the tasks and commands resolved for the components placed on it) over a NATS request-reply config pull, and heartbeats separately on its own subject (the protocol), so liveness tracks independently of the pull.

Config propagation (declared change to running node)

Section titled “Config propagation (declared change to running node)”

The edge is outbound-only: a node sits behind NAT, so the server never dials it. A node is a NATS client over the WAN, one authenticated outbound connection (an nkey/JWT credential bound to node.name); everything server-to-node arrives on subjects the node is permitted to consume. Three flows share the connection:

Buffering and retention are cascade settings

Section titled “Buffering and retention are cascade settings”

A node is created server-side first (its node.name and properties), the UI mints a per-node enrollment token, and the node claims its identity on first connect, exchanging the token for its NATS credential (a per-node JWT signed for its nkey, scoped to the subjects its placement allows, identity and access).

The built interface types, their per-task params, and the fixed samples each emits are the collection type catalog (interface types and their config); this page covers how the node executes them: reachability gating, sessions, the task queue, tick scheduling.

Any interface with a host address gets reachability for free: the node pings the host and checks the declared port(s), continuously and out of band; a smart default, bypassable per interface (for endpoints that drop ICMP or have no port).

The node ships a native TelemetryBatch: { samples, labels } plus an envelope (task, batch ts), published to the JetStream raw ingress subject (protobuf-encoded, the proto surviving as the NATS message schema).

Tick scheduling, concurrency, and self-observability

Section titled “Tick scheduling, concurrency, and self-observability”