feat(#3434): agent creation takes the hive it is aimed at
`POST /api/agents` now requires `hive` alongside `name`. It is parsed as an `Ident` like `name` already was, and then checked against the roster loaded from `SWARM_CONTROLLER_HIVES` -- a hive that is not in this swarm is a 400 naming the ones that are, rather than a typo accepted and forgotten. The roster check is what makes the field worth having; without it nothing notices until a deploy message is addressed to a hive that does not exist. `hive` is an address, not an attribute of the agent: it is where a deploy message goes over the queue, so nothing writes it into the agent's config repo. A config naming its own hive would be a second statement of where the agent lives, free to drift from the queue that actually delivers to it. It rides on the `InitAgentConfigRepo` node payload because the graph is the only thing carrying the operator's choice forward from the API boundary; seeding does not consume it. The node that routes on it is the deploy node in #3124. The refusal is asserted by effect -- the test checks that *nothing was queued*, not just the status code, since a version that queued the graph and then complained would satisfy a status-only assertion while still creating the agent. This is a breaking change for every existing caller: the swarm-UI create page posts `{name}` only and needs its hive dropdown to land alongside.
This commit is contained in:
parent
3efeffd95f
commit
8b55a8b9fd
2 changed files with 183 additions and 10 deletions
|
|
@ -486,6 +486,14 @@ fn base64_encode(content: &str) -> String {
|
|||
/// `hive-c0re::lifecycle::setup::initial_agent_nix` writes at the per-hive
|
||||
/// level (this process has no access to that function across the crate
|
||||
/// boundary, and it's three lines — not worth a shared crate for).
|
||||
///
|
||||
/// Deliberately does **not** record which hive the agent belongs to, even
|
||||
/// though `POST /api/agents` now takes one: an agent's config should carry
|
||||
/// no reference to the hive it runs on. The hive is an address the swarm
|
||||
/// routes on, not a property of the agent — a
|
||||
/// config that named its own hive would be a second place stating where
|
||||
/// the agent lives, free to disagree with the queue that actually
|
||||
/// delivers to it.
|
||||
fn initial_agent_nix(name: &str) -> String {
|
||||
format!(
|
||||
"{{ config, pkgs, lib, ... }}:\n{{\n # Per-agent overrides for {name}. This is a regular NixOS module\n # — add packages, services, modules, imports as needed.\n #\n # imports = [ ./extra-module.nix ];\n # environment.systemPackages = with pkgs; [ ];\n}}\n",
|
||||
|
|
|
|||
Loading…
Reference in a new issue